当前位置: 首页 > 图灵资讯 > 行业资讯> Python带你极速理解快速排序!

Python带你极速理解快速排序!

来源:图灵python
时间: 2025-02-10 13:32:42

快速排序作为我们在数据结构面试中经常看到的算法,我们对它的理解和掌握是非常重要的。让我用一个简单的步骤描述图和代码描述来快速理解它。

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort)。

通过排序将要排序的数据分为独立的两部分,其中一部分的所有数据都小于另一部分的所有数据,然后按照这种方法快速排序这两部分的数据,整个排序过程可以递归,从而使整个数据有序列。

步骤为:

1.从数列中挑出一个元素,称为"基准"(pivot),

2.重新排序数列。所有元素小于基准值的放置在基准前,所有元素大于基准值的放置在基准后(相同数量可以到达任何一侧)。分区结束后,基准位于数列的中间。这就是所谓的分区(partition)操作。

3,递归地(recursive)对小于基准值元素的子数列和大于基准值元素的子数列进行排序。

importrandom
defquick_sort(alist,start,end):
ifstart>end:
return
#如果前值大于后值,此时low指针和high指针重合
low=start
high=end

middle=alist[start]
#middle是我们开始时设定的基准值,low和high表示指针的位置

whilelow<high:
whilelow<highandalist[high]>=middle:
high-=1
alist[low]=alist[high]
whilelow<highandalist[low]<=middle:
low+=1
alist[high]=alist[low]
#退出循环时,证明low指针指向的数据大于基准midle,因此交换大于midle的数量和high位置
alist[low]=middle
#循环启动后,low和high的位置重叠。此时,重叠的位置是midle元素应该在的位置。此时,将middle放置在这里,一个大循环结束
quick_sort(alist,start,low-1)
quick_sort(alist,low+1,end)
list1=[]
#用生成随机数的方法来验证我们的排序算法
foriinrange(30):
list1.append(random.randint(1,300))
quick_sort(list1,0,len(list1)-1
print(list1)

时间复杂度

复杂的最佳时间:O(nlogn)

最坏的时间复杂度:O(n2)

稳定:不稳定

从一开始,快速排序平均需要O(n log n)对时间的描述并不明显。但不难观察到的是分区运算,每个循环中都会有一个数组元素,使用O(n)时间。在使用组合版本中,这个操作也是O(n)。

在最好的情况下,每次我们运行一个分区,我们将把一个数字分成两个几乎相等的片段。

这意味着每次递归调用处理一半大小的数列。

所以,在达到大小为一的数列之前,我们只需要做logo N次嵌套调用。

这意味着调用树的深度是O(log n)。

但在同一层次结构的两个程序调用中,原数列的相同部分不会处理;因此,程序调用的每个层次结构只需要O(n)时间(每个调用都有一些共同的额外成本,但因为每个层次的结构只有O(n)个调用,这些总结在O中(n)系数中)。

结果是这个算法只需要使用O(n log n)时间。

更多Python知识,请关注Python视频教程!!