归并排序Python代码
归并排序是面试最常考内容,
让你描述算法,
让你写算法,
让你分析时间复杂度
归并排序merge sort思路:
归并排序中间劈一刀,数组分两半,两边排好序,最后把左右两个合并。就是先局部有序,再整体有序。
时间复杂度
归并排序复杂度最好,最坏,平均都是nlogn。是严格的nlogn复杂度。
空间复杂度
归并排序需要额外的O(N)空间,因为要合并两个数组,不可能在原地合并数组,必须要开辟新的空间来合并
采用了九章算法老师Java版本,直接无脑翻译为了Python版本
class Solution():def sortIntegers2(self, A):if not A:return temp = [0] * len(A)return self.mergeSort(A, 0, len(A) - 1, temp)def mergeSort(self, A, start, end, temp):if start >= end:return#无脑先分为两半#先递归到左边进行排序self.mergeSort(A, start, (start + end)//2, temp)#再递归到右边进行排序self.mergeSort(A, (start + end)//2 + 1, end, temp)#合并数组的左右两部分return self.merge(A, start, end, temp)#合并两个子数组def merge(self, A, start, end, temp):middle = (start + end) // 2leftIndex = start #左侧子数组指针rightIndex = middle + 1 #右侧子数组指针index = leftIndex# 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置while leftIndex <= middle and rightIndex <= end:if A[leftIndex] < A[rightIndex]:temp[index] = A[leftIndex]index += 1 leftIndex += 1 else:temp[index] = A[rightIndex]index += 1 rightIndex += 1 #最后有可能剩下一个数组还没有结束while leftIndex <= middle:temp[index] = A[leftIndex]index += 1 leftIndex += 1while rightIndex <= end:temp[index] = A[rightIndex]index += 1 rightIndex += 1 #把临时数组的值依次给for i in range(start, end+1):A[i] = temp[i]#A = tempreturn A obj = Solution()
a = [3,2,1,4,5]
b = obj.sortIntegers2(a)
print(b)
输出:
[1, 2, 3, 4, 5]
[Finished in 0.1s]
网页测试的代码
class Solution():def sortIntegers2(self, A):if not A:return temp = [0] * len(A)self.mergeSort(A, 0, len(A) - 1, temp)def mergeSort(self, A, start, end, temp):if start >= end:return#无脑先分为两半#先递归到左边进行排序self.mergeSort(A, start, (start + end)//2, temp)#再递归到右边进行排序self.mergeSort(A, (start + end)//2 + 1, end, temp)#合并数组的左右两部分self.merge(A, start, end, temp)#合并两个子数组def merge(self, A, start, end, temp):middle = (start + end) // 2leftIndex = start #左侧子数组指针rightIndex = middle + 1 #右侧子数组指针index = leftIndexwhile leftIndex <= middle and rightIndex <= end:if A[leftIndex] < A[rightIndex]:temp[index] = A[leftIndex]index += 1 leftIndex += 1 else:temp[index] = A[rightIndex]index += 1 rightIndex += 1 #最后有可能剩下一个数组还没有结束while leftIndex <= middle:temp[index] = A[leftIndex]index += 1 leftIndex += 1while rightIndex <= end:temp[index] = A[rightIndex]index += 1 rightIndex += 1 #把临时数组的值依次给for i in range(start, end+1):A[i] = temp[i]#A = temp
https://www.lintcode.com/problem/sort-integers-ii/description
测试通过了
认识你是我们的缘分,同学,等等,学习人工智能,记得关注我。
微信扫一扫
关注该公众号
归并排序Python代码相关推荐
- 归并排序(Python代码)
1.归排序 归并排序用的是分治法,把一个大问题化解为k个中问题,每个中问题再化解为k个小问题,直至问题化为最小可解的问题.对这些问题求解,再不断地合并结果,直至合并完毕. 如下图: 注意: 合并方法, ...
- 快速排序和归并排序的区别,Python代码实现
排序理念比较: 归并排序merge sort思路: 归并排序中间劈一刀,两边再排序,然后把左右两个合并.就是先局部有序,再整体有序. 快速排序思路: 随便选择一个数字作为中间点,小于放在左边,大于放在 ...
- python代码实现归并排序(Merge Sort )
python代码实现归并排序(Merge Sort ) 归并排序(Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法.算法是采用分治法(Divide and Conquer)的一 ...
- 计数排序、桶排序和基数排序的运算性能对比及总结区别(附python代码)
首先证明一波排序算法的运算性能,如下图.对于50万个数据的无序列表,时间复杂度为的桶排序和计数排序明显比复杂度为的归并排序和快速排序性能好至少一个数量级. 1. 计数排序 1.1 基本原理:首先确定 ...
- 排序算法对比、总结(Python代码)
上海站 | 高性能计算之GPU CUDA培训 4月13-15日 三天密集式学习 快速带你晋级 阅读全文 > 正文共6126个字,27张图,预计阅读时间16分钟. 排序大的分类可以分为两种:内排 ...
- 二路归并排序Python实现-III
二路归并排序Python实现-III 归并排序 是一种 效率比较高并且稳定的算法.时间复杂度 O(NLog(N)),空间复杂度 O(N). 归并排序(Merge Sort)是建立在归并操作上的一种有效 ...
- 角谷猜想python代码_查看“Python-2020-fall”的源代码
因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...
- 关于创建zeromq消息队列,设置和更改IP地址,远程可以访问,不只是本地链接。python代码。
关于zeromq的创建,绑定本地,和绑定其他客户端的方法. 网上一大堆关于zmq的通信模式的介绍,包括三种类型,具体我就不在描述. 但是他们给的demo,都是创建本地作为server服务端,也作为cl ...
- python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!
我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...
最新文章
- angular 注入器配置_angular依赖注入
- 逻辑分析仪抓取波形参数设置
- .NET Core使用NLog通过Kafka实现日志收集
- golang java rpc_golang两种调用rpc的方法
- 美发新造型 名家创意示范集锦(图)
- 100 计算机网络基础知识
- three.js 文本_使用Three-bmfont-text在Three.js中创建文本
- RoboWare Studio安装教程
- Android 输出word文件中插入图片
- 【技巧记录】如何批量制作文件夹/文件夹名
- CSP-J (初中级别比赛)初赛总结
- laravel mews/captcha包安装图形验证后 提示验证码错误
- Problem D 牛栏(aggr)
- 计算机网络与互联网的区别,计算机网络与互联网的主要区别是什么?
- 算法之美_源码公布(1)
- 关闭win7的程序兼容性助手
- 【编译原理】自上而下语法分析(CC++源码+实验报告)
- 974. Subarray Sums Divisible by K [Medium]
- C语言字符5,C语言字符数据(4、5).doc
- 《月亮与六便士》书摘