快速排序
来源:互联网 发布:山东税务软件下载 编辑:程序博客网 时间:2024/05/19 13:07
快速排序:
输入:乱序n长数组
输出:排序好的n长数组
时间复杂度:O(nlogn)
空间复杂度:O(1)
快速排序的基本逻辑是这样的:每次随机挑选一个数组的元素,作为“枢轴”,然后扫描数组中其他的所有元素,将小于枢轴的,排列在枢轴的左侧,大于枢轴的,排列在枢轴的右侧。然后再分别对枢轴左右两侧的部分数组进行快速排序(这是一个递归的逻辑),这样,当递归运算“触底”后(每次需要快排的部分数组中只有一个元素),逐层返回,就最终得到排好序的数组了。
举例说,需对数组[6,5,3,1,8,7,2,4]进行快排,不失一般性,我们选择数组的第一个元素,这里是6,作为枢轴,随后扫描[5,3,1,8,7,2,4]部分,那么经过调整后,数组变为[4,5,3,1,2,6,8,7],6之前的元素都比6小,6之后的都比6大。然后再用快排分别处理[5,3,1,4,2]部分和[7,8]部分。需注意的一点是经过第一次快排,其实是确定了枢轴元素在排好序的整个数组中的位置。
我们详细看一下算法细节:排序L = [6,5,3,1,8,7,2,4]
(1) 选定6作为枢轴
(2) 5 < 6,count = 1 -> 5与L[1]交换位置,这里相当于不变
(3) 3 < 6,count = 2 -> 3与L[2]交换位置,这里相当于不变
(4) 1 < 6,count = 3 -> 1与L[3]交换位置,这里相当于不变
(5) 8 > 6 -> 不作为
(6) 7 > 6 -> 不作为
(7) 2 < 6,count = 4 -> 2与L[4]交换位置,这里相当于2与8交换位置 -> L = [6,5,3,1,2,7,8,4]
(8) 4 < 6,count = 5 -> 4与L[5]交换位置,这里相当于4与7交换位置 -> L = [6,5,3,1,2,4,8,7]
(9) 最后一步,将枢轴和现在count所指的元素交换位置:6与L[5]交换 -> L = [4,5,3,1,2,6,8,7]
同理,再分别对6左边的部分和6右边的部分进行快排,即可得到排序的数组。
输入:乱序n长数组
输出:排序好的n长数组
时间复杂度:O(nlogn)
空间复杂度:O(1)
快速排序的基本逻辑是这样的:每次随机挑选一个数组的元素,作为“枢轴”,然后扫描数组中其他的所有元素,将小于枢轴的,排列在枢轴的左侧,大于枢轴的,排列在枢轴的右侧。然后再分别对枢轴左右两侧的部分数组进行快速排序(这是一个递归的逻辑),这样,当递归运算“触底”后(每次需要快排的部分数组中只有一个元素),逐层返回,就最终得到排好序的数组了。
举例说,需对数组[6,5,3,1,8,7,2,4]进行快排,不失一般性,我们选择数组的第一个元素,这里是6,作为枢轴,随后扫描[5,3,1,8,7,2,4]部分,那么经过调整后,数组变为[4,5,3,1,2,6,8,7],6之前的元素都比6小,6之后的都比6大。然后再用快排分别处理[5,3,1,4,2]部分和[7,8]部分。需注意的一点是经过第一次快排,其实是确定了枢轴元素在排好序的整个数组中的位置。
我们详细看一下算法细节:排序L = [6,5,3,1,8,7,2,4]
(1) 选定6作为枢轴
(2) 5 < 6,count = 1 -> 5与L[1]交换位置,这里相当于不变
(3) 3 < 6,count = 2 -> 3与L[2]交换位置,这里相当于不变
(4) 1 < 6,count = 3 -> 1与L[3]交换位置,这里相当于不变
(5) 8 > 6 -> 不作为
(6) 7 > 6 -> 不作为
(7) 2 < 6,count = 4 -> 2与L[4]交换位置,这里相当于2与8交换位置 -> L = [6,5,3,1,2,7,8,4]
(8) 4 < 6,count = 5 -> 4与L[5]交换位置,这里相当于4与7交换位置 -> L = [6,5,3,1,2,4,8,7]
(9) 最后一步,将枢轴和现在count所指的元素交换位置:6与L[5]交换 -> L = [4,5,3,1,2,6,8,7]
同理,再分别对6左边的部分和6右边的部分进行快排,即可得到排序的数组。
Python 代码如下:
def quick_sort(aList): first = 0 # 设定需要扫描的数组首尾位置 last = len(aList) - 1 # 改变参数的快速排序函数 aList = quick_sort_helper(aList, first, last) return aListdef quick_sort_helper(aList, first, last): # 这种情况说明扫描的数组部分只有一个元素了,直接返回 # 需要注意的是,原地排序没有真正意义上分割数组 # 只是对数组的不同部分做交换位置操作 # 所以“触底”后返回的是整个数组 if first >= last: return aList # 建立“枢轴”,不失一般性,令枢轴为扫描部分的第一个元素 pivot = aList[first] # 计数,求出比枢轴小的元素的个数(也就是需要调整到的位置索引) count = first for index in range(first + 1, last + 1):#扫描 if aList[index] < pivot: count += 1 # 交换位置 aList[index], aList[count] = aList[count], aList[index] aList[count], aList[first] = aList[first], aList[count] quick_sort_helper(aList, first, count - 1) # 递归运算 quick_sort_helper(aList, count + 1, last) return aList
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- XML基础解析<copy>
- s3c2440第一个流水灯驱动程序(JZ2440)
- EventBus3.0的使用
- 谁说理工男不浪漫?电子工程师的恋爱神器
- AC自动机+DP(POJ2778&&POJ3691)
- 快速排序
- flask upload file
- eclipse设置背景颜色、字体大小、行号、XML字体大小和颜色等操作
- POJ_P2728 Desert King(最优比率生成树)
- 桶排序
- update语句的执行步骤及commit语句的执行顺序
- Integer Inquiry(大数)
- 最大二分图匹配 邻接表优化
- (语法)内存地址和指针<一>