快速排序
来源:互联网 发布:淘宝店铺上传宝贝软件 编辑:程序博客网 时间:2024/05/01 17:28
引
quickSort堪称是排序算法中的经典之作。实现代码短小,但速度非凡。就短短2、30行代码我至今才一窥堂奥,感谢《啊哈,算法!》的启发。
快速排序的基本思路是分治。选择一个中间数,将数列分为比之小、大的两部分,进而对分割的自数列分别排序,直到子数列只有一个元素为止,整个排序完成。
分割数列
首先需要选择一个数将数列分开,左侧的比之小,右侧的比之大。这个数可以选择第一个元素。
版本一
def makeItemMidInSeq(s, i, end): """ set item i in middle of seq let the left items < s[i], right > s[i] """ # set j = i + 1 j = i + 1 # until j == end stop cmp while j < end: if s[i] > s[j]: # move s[j] to i pos for x in xrange(j, i, -1): tmp = s[x] s[x] = s[x - 1] s[x - 1] = tmp # move s[i] to next i += 1 # move s[j] to next j += 1 return i
版本二
def splitSeqTwoParts(s, x): """ 将序列s按数值x排成两部分,前半部分小于x,后半部分大于x 并返回分界位置,即最后一个小于x的值位置 """ # 指标i从开头,j从末尾依次遍历序列,i>=j时遍历停止 i = 0 j = len(s) - 1 while i < j: # 如果s[i]>x, s[j]<x,i,j交换, i,j继续移动 if s[i] > x and s[j] < x: tmp = s[j] s[j] = s[i] s[i] = tmp i += 1 j -= 1 # 如果s[i]<x, s[j]<x, j不动,i继续向后移动一位 elif s[i] < x and s[j] < x: i += 1 # 如果s[i]>x, s[j]>x, i不动,j继续向前移动一位 elif s[i] > x and s[j] > x: j -= 1 else: i += 1 j -= 1
递归分割
将分割出的子数列继续分割,直到数列只剩一个数为止,排序全部完成。
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 网络安全之端口防护
- unsupported_grant_type
- Examples Generating Excel Documents Using Python’s xlwt
- 如何通过V社官方API查找比赛记录
- XUtils使用
- 快速排序
- set中的set_union用法
- Redis添加访问密码
- Android 蓝牙
- Java内存模型FAQ(三)JSR133是什么?
- Android---破解锁屏密码、获取wi-fi密码
- Weka数据挖掘——分类
- websphere停止服务:此日期在当前日期/时间之后有效。如果客户机的时钟设置得比服务器的时钟早,就会出现这种情况。请验证此客户机与服务器的时钟是否同步,然后重试该请求。
- 浅谈 Java 多线程环境下 如何跟踪死锁 (例子)