快速排序python(递归)
2020-09-10 本文已影响0人
楠木cral
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤为:
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
lista = [20,5,15,47,58,25,23,26,14]
def quick_sort(lista, first, last):
# 递归的退出条件
if first >= last:
return
# 设定起始元素为要寻找位置的基准元素
mid_value = lista[first]
# low为序列左边的由左向右移动的游标
# high为序列右边的由右向左移动的游标
low = first
hight = last
while low < hight:
# 当hight位的值大于mid_value的值则一直向左移动
while low < hight and lista[hight] >= mid_value:
hight -= 1
# 停止移动要么low与hight重合,要么到了hight位值小于mid_value
lista[low] = lista[hight]
while low < hight and lista[low] < mid_value:
low += 1
lista[hight] = lista[low]
# hight -= 1
# 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
# 将基准元素放到该位置
lista[low] = mid_value
# 在做递归的时候没有用切片,是为了保证在做多次递归的时候操作排序的永远只会是这一个列表
# 先对标志位左边的先进行排序
quick_sort(lista, first, low-1)
# 再对标志位右边的先进行排序
quick_sort(lista, low+1, last)
return lista
print(quick_sort(lista,0, len(lista)-1))
image.png
时间复杂度
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(n2)
稳定性:不稳定