本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。
本文章是自己学习的一些记录。
开始
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤为:
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
快速排序算法的图分析
思路就是按照两个游标的相互移动来进行排序;
定义出中间值以及游标的位置(一般是选择数列的开头的元素和末尾的元素),将游标从两端开始移动;
当左边游标移动的元素大小小于中间值,则游标进行右移,当大于中间值,和另外的游标位置的元素进行替换;
然后右边的游标的位置开始移动,当移动的元素大于中间值,则游标进行左移,当小于中间值,另外的游标的元素进行替换;
相等时退出循环;
然后在中间值的左右两边分别被分成两个数列,然后同理,继续这样分,排序,直到分成每个数列都是一个元素,排序完成。
快速排序代码
#coding=utf-8
#@Time:2020/10/2 10:20
#@Author:csdn@hijacklei
#@File:快速排序算法.py
#@Software:PyCharm
def quick_sort(alist,first,last):
'''快速排序'''
#作为终止循环的条件
if first>=last:
return
#定义中间值
mid_value=alist[first]
low=first
high=last
#执行循环条件
while low<high:
#high左移
while low<high and alist[high]>=mid_value:
#右边大于中间值,游标往左移动
high-=1
#从循环体退出,high赋值给low的位置
alist[low]=alist[high]
while low<high and alist[low]<mid_value:
#小于中间值左边的游标往右移
low+=1
#从循环体退出,low赋值给high的位置
alist[high]=alist[low]
#从循环退出时,low==high
alist[low]=mid_value
#对low左边的列表执行快速排序
quick_sort(alist,first,low-1)
#对low右边的列表进行排序
quick_sort(alist,low+1,last)
if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li) #返回 [54, 26, 93, 17, 77, 31, 44, 55, 20]
quick_sort(li,0,len(li)-1)
print(li) #返回 [17, 20, 26, 31, 44, 54, 55, 77, 93]
时间复杂度计算
因为每次都是将一个分成两个,在继续这样分所以,类似与这样分下去:
所以第一次是2 第二次是4 第三次是8…所以最优时间复杂度是:
最坏时间复杂度为:
下面是教程的关于快排时间复杂度的解释:
参考资料:传智播客数据结构