Fork me on GitHub

  快速排序算法又称划分交换排序partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,

排序n个项目要O(nlogn)次比较。在最坏状况下则需要O(n*2)次比较,但这种状况并不常见。事实上,快速排序通常明显比

其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(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解决算法问题

posted on 2018-01-10 09:40  虚生  阅读(491)  评论(0编辑  收藏  举报