快速排序介绍
快速排序运用了分治的思想。对包含n个数的输入数组,最坏情况运行时间为o(n2)。虽然最坏情况运行时间比较差,但是快速排序通常是用于排序的最佳的实用选择。这是因为其平均性能相当好:期望的运行时间为o(nlog2n),且o(nlog2n)记号中隐含的常数因子很小。另外,它还能够进行就地排序,在虚存环境中也能很好地工作。–《算法导论》
时间复杂度
快速排序的时间复杂度取决于待排序数据的特征。在理想的一般情况下(待排序列为全无序),其性能可以达到o(nlgn)。但是在特殊的情况下(每次排序都不能起到基本有序的目的),最坏的性能为o(n2)。由于快速排序在排序时,不是逐个进行对比的,所以实际上是不稳定的。
代码实现
def Partition(arr, left, right, comp_func = lambda x, y: x < y):
''' divide array
1) divide arr into two part, bigger than pivot or other
2) regard arr[left] as pivot
'''
pivot = arr[right]
tail = left - 1
for i in range(left, right):
if comp_func(arr[i], pivot):
tail += 1
print("swap %d %d : %d %d" %(tail, i, arr[tail], arr[i]))
arr[tail], arr[i] = arr[i], arr[tail]
print(arr)
tail += 1
# this swap may caused unstable
arr[tail], arr[right] = arr[right], arr[tail]
return tail
def QickSort(arr, left, right):
if left >= right:
return
middle = Partition(arr, left, right)
QickSort(arr, left, middle - 1)
QickSort(arr, middle + 1, right)
运行示例
arr = [9, 1, 2, 5, 3, 8]
print(arr)
QickSort(arr, 0, len(arr)-1)
与冒泡排序相比,快速排序一次遍历结束后,数据达到了部分有序(相对于某个元素,大于这个元素,其他元素);而性能较差的冒泡排序,每次遍历结束后,只能达到一个数字有序。
参考推荐 https://www.cnblogs.com/eniac12/p/5329396.html