那些常用的算法与数据结构快速排序

快速排序的介绍

快速排序(quicksort)的采用了分治的策略。

分治策略指的是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

快排的基本思想是:在序列中找一个划分值,通过一趟排序将未排序的序列排序成独立的两个部分,其中左边部分序列都比划分值小,右边部分的序列比划分值大,此时划分值的位置已确认,然后再对这两个序列按照同样的方法进行排序,从而达到整个序列都有序的目的。

快排的动画演示快排的思路快排的python实现

先看一个简单的python快排实现

代码示例

deffake_quick_sort(arr):

iflen(arr)2:

returnarr

else:

pivot=arr[0]

left=[xforxinarr[1:]ifx=pivot]

right=[xforxinarr[1:]ifxpivot]

returnfake_quick_sort(left)+[pivot]+fake_quick_sort(right)

这段代码最关键的是pivot这个参数,这段代码里取序列的第一个元素,然后以这个元素为分组的基准,利用列表解析式使得它左边的值都比它小,右边的值都比它大。然后再分别对这些序列进行递归排序。这段代码虽然短小利于理解,但是其效率很低,所以函数名前面有个“fake”,主要体现在以下方面:

分组基准的选取过于随便,不一定可以取到列表的中间值

空间复杂度大,使用了两个列表解析式,而且每次选取进行比较时需要遍历整个序列。

若序列长度过于小(比如只有几个元素),快排效率就不如插入排序了。

递归影响性能,最好进行优化。

下面用Python写一个C风格的快排(这里可以体会到快排的精髓),当然了,其实没有完全解决上面的问题,有情趣的读者可以自己试试:

defquick_sort(arr,left,right):

ifleftright:

pivot=partition(arr,left,right)

quick_sort(arr,left,pivot-1)

quick_sort(arr,pivot+1,right)

returnarr

defpartition(arr,left,right):

pivotkey=arr[left]

whileleftright:

whileleftrightandarr[right]=pivotkey:

right-=1

arr[left]=arr[right]

whileleftrightandarr[left]=pivotkey:

left+=1

arr[right]=arr[left]

arr[left]=pivotkey

returnleft

快排的算法复杂度时间复杂度(平均)空间复杂度稳定性O(nlogn)O(logn)~O(n)不稳定

·END·

更多精彩,请







































白癜风的发病原因有哪些
预防白癜风的方法有哪些



转载请注明:http://www.92nongye.com/gaishu/204621771.html