Quick Sort

看一万遍忘一万遍,
再看亦是如初见。

对quick sort的思考,希望下次再看的时候能有蓦然回首灯火阑珊的感受!

对于quick sort, 无论排大排小,最核心的部分在于如何找到pivot, 并且为pivot 找到它最正确的位置。在业界,也叫用pivot 对需要排序的list进行partition.


  • 什么是partition?

简单说来,用K 对一个list进行partition,就是将该list分为两部分,一部分是小于k的部分,而另一部分是大于k的部分,然后输出那条分界线。

然而在quick sort中,在最核心的partition 之前,又多了一步,找pivot


  • 什么是pivot?

pivot就是一个list中的任意值,它可以将list分解为大于等于,和小于它的两部分,它所处的index就是该list此刻的值域分界线。
pivot可以是任意值,它的取值习惯一般分为种

    • start
    • end
    • mid
    • any
其中,最简单的取值方式要属于前面第一种和第二种,即start和end. 这是为什么呢?
因为在quick sort的时候,我们需要明确的知道每一条分界线具体的Index, 也就是说,在partition完成之后的那条分界限上的值必须要是之前选取的pivot.
简单说来,我们需要在记住pivot的位置,然后在partition结束后将pivot放置在那条分界线上。


  • 为什么要将每次选取的pivot放置在patition的分界线上?
我认为这是quick sort的精髓所在,在quick sort中,每次sort之后唯一确定的位置就是pivot的位置。因为pivot的位置固定,我们就可以使用divide and conquer 的算法,当找到该pivot的固定位置之后就可以只对(start, pivot-1) 和 (pivot+1, end)的部分进行sort.

Comments

Popular posts from this blog

Sudoku

Longest prefix matching - trie

Climbing Stairs