排序算法(一):快速排序
2015-12-12 08:33
686 查看
突然觉得在本科的时候自己的基本功练习的不是很过关,趁着学Python的热乎劲好好把基础算法过一过,等以后面试的时候也不会死的太惨。。。
快速排序(QuickSort):
快速排序的可以说是在数据量较大且数据够随机的情况下,平均时间复杂度最好的算法,如果你没办法判断待排序数据的随机度和规模,用QuickSort就对了。
最大时间复杂度O(n^2),平均时间复杂度O(n*logn)
讲解排序 L=[6,5,3,4,8,9,7,2,8]:
1.以上面的列表为待排序数字进行从小到大从左到右的排列,首先要设置两个标志位i,j,i指向第一个数字6,j指向最后一个数字8。
2.下面进行循环:首先保持左侧标志位i位置不变,对j操作,看L[j]的数值,如果L[i]>L[j],则交换两个数(i和j不交换,i永远在j的左侧),并j--;然后保持j不变,对i操作,看L[i]的数值,如果L[i]>L[j],则交换两数,并i++。然后重复该循环,直到i==j为止。
3.进行递归:设flag=L[i]]=L[j],经过一轮循环(我使用的是while循环)之后,flag左侧的数都比flag小,右侧的都比flag大,因此将序列分成L[0:i-1],L[i+1,len(L)-1]分别处理,这里要设置start和end,因为每次要处理的序列的起点终点都不一样。
4.递归的终止条件:当i>=j时break
源码(Python):
我有调用了一个Python自带的sorted()算法,书里写的sort()算法用的是归并排序,sorted算法也应该是归并排序吧......
运行时间如下:
我需要冷静
目前已经是最优化的QuickSort了,但是还是比系统函数慢,慢了整整一百倍,不知道别的语言写是不是也是这个效果......
快速排序(QuickSort):
快速排序的可以说是在数据量较大且数据够随机的情况下,平均时间复杂度最好的算法,如果你没办法判断待排序数据的随机度和规模,用QuickSort就对了。
最大时间复杂度O(n^2),平均时间复杂度O(n*logn)
讲解排序 L=[6,5,3,4,8,9,7,2,8]:
1.以上面的列表为待排序数字进行从小到大从左到右的排列,首先要设置两个标志位i,j,i指向第一个数字6,j指向最后一个数字8。
2.下面进行循环:首先保持左侧标志位i位置不变,对j操作,看L[j]的数值,如果L[i]>L[j],则交换两个数(i和j不交换,i永远在j的左侧),并j--;然后保持j不变,对i操作,看L[i]的数值,如果L[i]>L[j],则交换两数,并i++。然后重复该循环,直到i==j为止。
3.进行递归:设flag=L[i]]=L[j],经过一轮循环(我使用的是while循环)之后,flag左侧的数都比flag小,右侧的都比flag大,因此将序列分成L[0:i-1],L[i+1,len(L)-1]分别处理,这里要设置start和end,因为每次要处理的序列的起点终点都不一样。
4.递归的终止条件:当i>=j时break
源码(Python):
def QuickSort(list, start, end): i = start j = end while i<j: #初始状态满足start<end,才能进行排序 while i<j: if list[i] > list[j]: flag = list[i] list[i] = list[j] list[j] = flag while i<j: if list[i] > list[j]: flag = list[i] list[i] = list[j] list[j] = flag break else: i = i+1 #左侧下标+1 else: j = j-1 #右侧下标-1 QuickSort(list, start, i-1) QuickSort(list, i+1, end)
我有调用了一个Python自带的sorted()算法,书里写的sort()算法用的是归并排序,sorted算法也应该是归并排序吧......
运行时间如下:
我需要冷静
目前已经是最优化的QuickSort了,但是还是比系统函数慢,慢了整整一百倍,不知道别的语言写是不是也是这个效果......
相关文章推荐
- 【CF 应用开发大赛】IT Share(IT分享网)
- 快速排序
- 我是运营,我没有假期
- IT职场英语,必须学会
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 动易2006序列号破解算法公布
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- it人员要看饮食保健养生谚语
- Ruby实现的矩阵连乘算法
- 修复mysql数据库
- C#插入法排序算法实例分析
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二