首先扯淡,正题在分割线下面
本人博客:xingzhi.info
排序要的就是
速度够快,
耗费内存少,给这个方法起名字的人感觉像是在打广告。
现在排序动不动就是搞个集群,分块排,再合并,毕竟数据量太大了。
首先这个快排的适用情况是数据比较分散,不论是值的范围,还是组成
就是将需要排序的数据划分成等大区间,数据分布比较均匀
-------------------------------------我是分割线--------------------------------------
public class QuickSort {
/*
* data是存放数据的数组
* begin是需要排序的第一个数据
* end是需要排序的最后一个数据
*/
public static void sort(int[] data, int begin, int end)
{
int keyIndex = end;
int keyValue = data[keyIndex];
int left = begin;
int right = end;
while (begin < end)
{
//从左向右,找到第一个比关键值大的数字就停止寻找。
//
或者发现到右边,都没有找到,就不找了。
while(data[begin] < keyValue && begin < end)
{
begin++;
}
//如果发现没到头(就是没找完,就发现了比关键值大的数字)
//就把找到的那个值,往后移,移到end下标所在的位置
//
开始那个end位置的值已经腾出去了,放到keyValue里了
if(begin < end)
{
data[end] = data[begin];
}
//从右向左,找到第一个比关键值小的数字就停止寻找。
//或者发现到左边,都没有找到,就不找了。
while(data[end] > keyValue && end > begin)
{
end--;
}
//如果发现没到头(就是没找完,就发现了比关键值小的数字)
//就把找到的那个值,往左移,移到begin下标所在的位置
//上面那个begin位置的值已经腾出去了,放到end里了
//
如果上面没有能移动值,这也移动不了
if(begin < end)
{
data[begin] = data[end];
}
}
//这时候就把keyValue放回去
data[end] = keyValue;
//接下来,就用end下标作为分界线,左右两边各自进行一次快排
if (left < end-1)
{
sort(data, left, end-1);
}
if( end+1 < right)
{
sort(data, end+1, right);
}
}
public static void main(String[] args)
{
int[] data = {96, 6, 8, 5, 9, 7, 10, 23, 13, 17};
QuickSort.sort(data, 0, 9);
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" < ");
}
}
}本人博客:xingzhi.info