快速排序作为我们在数据结构面试中经常看到的算法,我们对它的理解和掌握是非常重要的。让我用一个简单的步骤描述图和代码描述来快速理解它。
快速排序(英语: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视频教程!!