快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,
排序n个项目要O(nlogn)次比较。在最坏状况下则需要O(n*2)次比较,但这种状况并不常见。事实上,快速排序通常明显比
其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
算法实现示意图,摘自百科:
python代码实现:
def quick_sort(a_list):
quicksort_sub(a_list,0,len(a_list) - 1)
def quicksort_sub(lst, lo, hi):
if lo < hi:
p = partition(lst, lo, hi)
quicksort_sub(lst, lo, p)
quicksort_sub(lst, p+1, hi)
return
def partition(lst, lo, hi):
pivot = lst[hi-1]
i = lo - 1
for j in range(lo, hi):
if lst[j] < pivot:
i += 1
lst[i], lst[j] = lst[j], lst[i]
if lst[hi-1] < lst[i+1]:
lst[i+1], lst[hi-1] = lst[hi-1], lst[i+1]
return i+1
a_list = [54,26,93,17,77,31,44,55,20]
quick_sort(a_list)
print a_list
该算法创始人安东尼爵士,是一位计算机领域的大牛,他的几大贡献(设计了快速排序算法、霍尔逻辑、交谈循序程式。提出了操作系统中的哲学家就餐问题),每个单独拎出来都可以在计算机历史上留名。翻开前辈的履历,才发现该前辈的经历十分
丰富,学过艺术,当过兵,学过俄语,做过教育,闯过职场,不过,最终他选择了计算机作为灵魂深处的归宿,并凭着在计算机领域的神话般的造诣,创造了一个又一个神话,开编译器,设计算法,研究操作系统。
这样的前辈,只能用这句话来表达笔者的敬仰之情-----高山仰止 景行行止。
参考目录:
1 https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
2 算法导论
3 python解决算法问题