快速排序算法讲解

来自百度的概念解释:快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列
 

  通过一趟排序将要排序的数据分割成独立的两部分,其中一部分所有数据都比另外一部分的所有数据都要小,这句话对应的就是下面的partition()方法:
partition就是分割的意思
.可以理解为:此方法将数组中指定索引的数,迁移到它的"应有位置",并且使得它前面的数都比它小(或有相等),它后面的数都比它大(或有相等),
其余数的顺序不作要求.
  我说的"应有位置"是指:将这组数,从小到大排序后,它应该在第几位.比如数组arr={7,5,8,3,2,10},经过partition(arr,0,arr.length-1)后,7应该在第四位,其他数满足:
比7小的都在7前面,比7大的都在7后面;这不正是在向我们的目的靠近?我们排序的目的不就是要将所有的数都放到它的"应有位置"吗?
  此时,7已经在应有位置了,并且partition过后的返回值就是它的索引4,再通过下面第二个方法,分别对两边的数重复上述操作...分治思想,递归...可达目的;

//快速定位: 此方法将索引为low的值移动到从小到大排序情况下它该有的"应有位置"
protected static int partition(int sortArray[], int low, int hight) {
int key = sortArray[low];//低索引的值赋值给 key ,作为本次paitition()方法中的参考值,
  //并且使得在第一次小循环中,低索引可以接受其它赋值,因为它的值key已经被作为局部变量存储,不用担心数组中某些值在传递中丢失;
while (low < hight) {
    
     //从右往左扫描,找到第一个比key小的值 ,将此值(此时的高索引对应的值)赋值给低索引
     //此轮小循环中,低索引不动,等待从右向左找出第一个比参考值小的数,赋值给它
     //接下来,就是这个从右向左找出的第一个这样的数的位置(下一轮小循环的高索引)等待赋值,不用担心数组中某些值在传递中丢失;

while (low < hight && key <= sortArray[hight])
hight--;//左移高索引 hight
sortArray[low] = sortArray[hight];

     //从左往右扫描,找到第一个比key大的值 ,将此值
(此时的低索引对应的值)赋值给高索引
     //此轮小循环中,高索引不动,等待从左向右找出第一个比参考值大的数,赋值给它
     //接下来,就是这个左向右找出的第一个这样的数的位置(下一轮小循环的低索引)等待赋值,不用担心数组中某些值在传递中丢失;

while (low < hight && sortArray[low] <= key )
low++;//右移低索引 low
sortArray[hight] = sortArray[low];
}//高索引与低索引碰头,结束循环 low=hight
sortArray[low] = key;//值传递过程收尾,这是一个闭环,最终原先索引为low的值找到它"应有位置";
return low;
}
//分治思想,对分割后的两部分数据分别进行分割,每一次分割,都对应地有一个数(以上代码中时最左边的那个)找到它的应有位置;
//当所有数都找到应有位置,排序结束;显然,这不会是一个死循环,经过有限次partition();能达到排序目的;效率也是相当高的,至少比冒泡,选择高多了;
//由于本人技术有限,尚不能在效率层面对其做出数理分析,还望大牛给出意见!
public void sort(int low, int hight) {
if (low < hight) {
int result = partition(data, low, hight);
sort(low, result - 1);
sort(result + 1, hight);
}

}
posted @ 2017-03-21 00:32  苹果环境  阅读(247)  评论(0编辑  收藏  举报