快速排序
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左边的数小于它,右边的数大于它。

浙公网安备 33010602011771号