快速排序算法
这里做的是讲数据从小到大进行快速排序, 对于数据量较大的情况 ,快速排序效果特别明显, 下面说说思路
a. 选择参照物, 一般而言, 选取最右边的数据作为参照物, 例如 长度为10 的数组, 参照物就选择下标为 9 的数据
b. 左右指针, 说的挺吓人的 , 其实就是两端的下标
从左边起,找到第一个比参照物大的数; 从右边起,找到第一个比参照物小的数, 左右指针没有交叉的情况下, 交换左右指针对应的数据.
若左右指针交叉, 交换左指针和参照物的数据, 记录左指针的位置
总的思路是这个样子的,具体代码实现如下:
/**
* @param datas
* @param from
* @param end
*/
public static void fastSort(Object[] datas ,int from , int end ){
if ( from >= end ) {
return;
} else {
int mid = fastSortHelp(datas, from, end);
fastSort(datas,from,mid-1);
fastSort(datas,mid+1,end);
}
}
private static int fastSortHelp( Object[] datas, int from ,int end ) {
int middle = 0;
int left = from -1;
int right = end;
Object data = datas[end]; // 从最后一个开始
while ( true ) {
while (++left < right && !compare(datas[left],data));// 从左到右的数据都小于参照物,什么都不做
while (--right >= from && compare(datas[right],data));// 从右到左的数据都大于参照物,什么都不做
if ( left < right ) {// 没有交叉,仅交换左右指针数据
exchange(datas,left,right);
continue;
} else {// 交叉,交换左指针数据和参照物,记录中间位置
exchange(datas,left,end);
middle = left;
break;
}
}
return middle;
}
public static void exchange(Object[] datas,int a, int b ){
Object temp = datas[a];
datas[a] = datas[b];
datas[b] = temp;
}
/**
* 比较:
* 如果o1 < o2 返回结果为false 反之为 true
* @param o1
* @param o2
* @return
*/
public static boolean compare(Object o1,Object o2){
boolean res = true;// 如果o1 > o2,返回结果为true
if ( o1 instanceof Comparable) {
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
if ( c1.compareTo(c2) < 0 ) {
res = false;
}
} else {
if (o1.toString().compareTo(o2.toString()) < 0) {
res = false;
}
}
return res;
}