快速排序比冒泡排序,选择排序,插入排序速度都快
快速排序思路:
^取一个元素P,(第一个元素),使元素P归位。
^列表被P分成了两部分,左边都比P小,右边都比P大。
^递归完成排序。
过程:
把5拿出来存到tmp,5的位置是指针left,right指针在8,8>5,right指针-1,9又>5,right再次-1
right来到2,2<5,所以left指针处(5),成为2,此时right指针成为空元素(原来2的位置),所以left指针+1,left到了元素7,由于7>5,所以7要去列表右侧,所以right指针处(原来2的位置),变为7,依次类推,两指针交替变换
完成第一轮归位后,左侧和右侧再次分别进行归位,递归完成排序
python
def quick_sort(li,left,right): # 一开始传进来left=0
if left<right:
mid=partition(li,left,right) # 返回下标值,从列表第一个值开始,每次定位在中间值
quick_sort(li,left,mid-1)
quick_sort(li,mid+1,right)
python
def partition(li,left,right):
tmp=li[left] # 把第一个值存起来
while left<right:
while left<right and li[right]>tmp:
right-=1 # 往左走一步
li[left]=li[right] # 右边的值写到左边空位上
while left<right and li[left]<=tmp:
left+=1
li[right]=li[left] # 把左边的值写到右边空位
li[left]=tmp # 把tmp归位
return left # 返回mid值,left,right都行
如果是一个原本就逆序的数列要排成顺序数列,每一轮都只确定了基准元素的位置
这时最坏情况,时间复杂度退化成了O(n方)
我们可以避免这种最坏情况的发生,随机选择一个元素作为基准元素(不是第一个)
这样快速排序时间复杂度可以看出是O(nlogn)