一、快速排序的工作原理
1.快速排序(Quicksort)是对冒泡排序冒泡排序算法的一种改进。
2.快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
二、逻辑实现
[54,26,93,17,77,31,44,55,20] #升序排序 #基准数(第一个元素)54(比54小的放左边,比54大的放右边) #low = 1 #high = n-1
三、代码实现
def quick_sort(alist,start,end):
#递归退出条件
if start>=end:
return
#基准数
mid = alist[start]
low = start
high=end
while low<high:
#从右向左 alist[high]>mid 则high-=1
while low<high and alist[high]>=mid:
high-=1
#将high索引对应的元素赋值给low
alist[low]=alist[high]
#从左往右 alist[high]<mid 则low+=1
while low<high and alist[low]<mid:
low+=1
#将high索引对应的元素赋值给low
alist[high]=alist[low]
#将基准数放置到对应的位置
alist[low]=mid
#比基准数小的即左边的数据,要重复调用quick_sort()
quick_sort(alist,start,low-1)
#比基准数大的即右边的数据,要重复调用quick_sort()
quick_sort(alist,low+1,end)
if __name__ == '__main__':
alist = [54,26,93,17,77,31,44,55,20]
print('原数组:')
print(alist)
print("排序后的数组:")
quick_sort(alist,0,len(alist)-1)
print(alist)
结果展示:
原数组:
[54, 26, 93, 17, 77, 31, 44, 55, 20]
排序后的数组:
[17, 20, 26, 31, 44, 54, 55, 77, 93]
四、快速排序的时间复杂度及其稳定性
1.最优时间复杂度:O(nlogn) 2.最坏时间复杂度:O(n^2) 3.稳定性:不稳定