Quicksort
2019-03-03 本文已影响0人
一叶夏幕
Quicksort是一个分而治之的算法,它根据主元把一个大数组分成2个小数组:其中1个数组的元素要比主元小,另一个要比主元大。Quicksort至今依然是一个常用的排序算法,如果算法实现好的情况下,它的速度要比merge sort 和 heapsort快2到3倍。一个有效实现地Quicksort 并不是一个stable sort,即相等元素的相对顺序不能被保证。Quicksort 也可以在一个数组上进行原址排序。数学分析表明,quicksort排序n个元素平均需要O(nlogn)O(nlogn) 比较,在最坏的情况下,它需要O(n2)O(n2)次比较,虽然这样的行为不常见。
Quicksort的步骤
Quicksort主要包含以下3步:
- 从数组中取出一个元素,叫做主元(pivot)
- 重排序数组,使得所有小于pivot的元素在它前面,所有大于pivot的元素在它后面,等于pivot的元素放在哪面都行。这样的划分以后,pivot的位置已经排好了。这个过程叫做partition操作
- 递归地应用步骤2到小于pivot的子数组和大于pivot的子数组
在上面的步骤中,递归的base case是数组的大小为0或1,因为这样的数组已经有序,不需要再排序。我们有很多方式来选择pivot,不同地方式会对算法的性能有很大地影响。
def partition(a, l, r):
i = l
j = r
while i < j:
while a[i] < a[l] and i < j:
i += 1
while a[j] > a[l] and i < j:
j -= 1
if i < j:
temp = a[i]
a[i] = a[j]
a[j] = temp
temp = a[l]
a[l] = a[j]
a[j] = temp
return j
def quick_sort(a, l, r):
if l < r:
index = partition(a, l, r)
sort(a, l, index - 1)
sort(a, index + 1, r)
return a
a = [2, 4, 5, 3, 8]
quick_sort(a, 0, 4)