排序--QuickSort 快排

 

   Quick の implementation


 

  快排,就像它的名字一定,风一样的快。基本上算是最快的排序算法了。快排的基本思想是选择一个切分的元素。把这个元素排序了。所有这个元素左边的元素都小于这个元素,所有这个元素右边的元素都大于这个元素。接着再把左右2个数组分别排序。

  假设你有如下数组 (所有 i  左边的对象都小于 切分对象。 所有 j  右边的对象都大于切分对象 这句话稍后有用 先知道一下)

  

  首先,我们把index = 0 的元素当作切分元素。

  从index = 1 的位置开始,找到第一个大于49的元素。发现65 大于 49 所以标记一下 i = 2

  

  接着从数组的末尾开始找第一个小于49的,发现 index = 6 的时候,value = 27 小于 49 所以mark一下

  

  现在交换i 和 j 的元素。

  

  交换之后,元素又符合刚才的定义了(所有 i  左边的对象都小于 切分对象 因为i会继续向右边寻找元素,所有现在i位置的元素必须要小于切分元素, 要不然就不符合定义 i 左边的元素都小于 切分元素)  并且 (所有 j  右边的对象都大于切分对象)

  所以可以接着往下走

  继续从i = 2的位置开始 找到 大于49的元素,找到了 i = 3的时候value = 97

  

  继续从右边开始找 发现 j = 5 的时候13 小于49 

  

  交换位置

  

  现在 i 继续前进 。停止在 index = 4 的位置, 76 大于 49

  

  j 也继续从右边往左边找。当j = 3 value = 13 小于49 

  

  i >= j 所以不用交换位置。 这个时候需要把切分元素和 j 位置的元素交换位置

  

  这个时候 index = 3 的位置就已经是排好的位置了。 49 的右边的元素都 大于49 , 49 左边的元素都小于49

  接着就可以排序 0 - 3 的元素 和 4 到 7 的元素了。

  盗一张图帮忙理解

  

  具体的实现https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/QuickSort.java

  有讲不清楚的地方,希望可以给我留言。因为感觉自己写博客并不是很很好。嘎嘎

  

 

 

 

 

 

 

 

 

 

  

 

 

 

  

posted @ 2017-09-19 11:24  哇哩顾得  阅读(327)  评论(0编辑  收藏  举报