快速排序

http://developer.51cto.com/art/201403/430986.htm   http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html

快速排序的步骤:

(1)在数据集之中,选择一个元素作为"基准"(pivot)。

(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

完成一趟(2)的过程:

设 基准数为a[0],设哨兵i=0,j=n-1;先移动j(不能先移动i),寻找小于基准的数,j停下来,移动i,找大于基准的数,此时i,j指向的数互换位置。

假设一:j与i不相遇,j总可以找到小于的数,i总可以找到大于的数

假设二:j找不到小于的数,i一直停留在上一次互换发生的位置,最终j移到了i处,此处的数小于基准,将i与基准互换,此时基准在排序要求中的正确位置了

假设三:i找不到大于的数,i一直移到遇到j,此处的j不是大于基准的数,为什么???因为j总是先移动找到了小于的数,才会再移动i,所以i,j相遇处总是小于基准的数,将基准

与i互换,基准到了正确位置。

如数列 3 4 5 6 7 8 -1 0 1 第一次交换为3 1 5 6 7 8 -1 0 4 第二次为3 1 0 6 7 8 -1 5 4第三次为 3 1 0 -1 7 8 6 5 4(此时i指向-1处) 第四次为 -1 1 0 3 7 8 6 5 4,

3左边的数小于它,右边的数大于它。

posted @ 2017-04-24 18:43  hchacha  阅读(147)  评论(0)    收藏  举报