Java 排序算法之快速排序
快速排序相比其他几个排序相对复杂一些,在这里专门梳理一下,本文建了两个类,一个快速算法代码,一个测试,代码如下:
快速算法代码类:
package cha02;
import java.util.Comparator;
public class QuickSort {
private static <T> void swap (T[] array,int begin,int end){
//值交换
T t = array[begin];
array[begin] = array[end];
array[end] = t;
}
//判断是升序还是降序
private static boolean asc(boolean...ascend){
return ascend.length==0 || ascend[0];
}
//[asc] end ->升序 [desc] end ->降序
//动态参数在方法中是作为数组处理的
//快速排序算法
//找出向对中间的一位数(如果是中位数则效率最高)
private static <T> int mid(T[] array, int begin, int end, Comparator<T> cmp,boolean asc){
int _begin = begin;
while (begin<end) {
while (begin<end && (asc ? cmp.compare(array[end],array[_begin])>=0
: cmp.compare(array[end],array[_begin])<=0)) end--;
while (begin<end && (asc ? cmp.compare(array[end],array[_begin])>=0
: cmp.compare(array[end],array[_begin])<=0)) begin++;
if (begin<end) {
swap(array,begin,end);
}
}
if(begin != _begin){
swap(array,_begin,begin);
}
return begin;
}
//从相对中间的一位数 一分为二
private static <T> void split(T[] array,int begin,int end,Comparator<T> cmp,boolean asc){
if(begin>=end){
return;
}
int mid = mid(array,begin,end,cmp,asc);
split(array,begin,mid-1,cmp,asc);
split(array,mid+1,end,cmp,asc);
}
//快速排序
public static <T> void quickSort(T[] array,int begin,int end,Comparator<T> cmp,boolean...ascend){
boolean _ascend = asc(ascend);
split(array,begin,end,cmp,_ascend);
}
}
测试代码类:
package cha02;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;
public class Text {
public static void main(String[] args) {
//比较器
Comparator<Integer> cmp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
};
final int N = 10;
Random rand = new Random();
Integer[] array = new Integer[N];
for (int i = 0; i < array.length; i++) {
array[i] = rand.nextInt(N*10);
}
long tb = System.currentTimeMillis();
System.out.println(Arrays.toString(array));
System.out.println("----快速算法排序后----");
System.out.println("TIME CONSUMPTION : "+ (System.currentTimeMillis()-tb)/1000.0);
QuickSort.quickSort(array,0,N-1,cmp);
System.out.println(Arrays.toString(array));
}
}
本文中为通用快速排序通用写法,可以根据需求改变是升序还是降序排序,默认为true升序排序,另外可以改变排序的位置,从下标某个位置到下标某个位置,进行排序。
不足之处,本文中没有验证代码的书写,验证数组以及数据的有效性,实际开发中验证也是非常重要的。
另外中位数问题,如果快速排序之前先找到中位数,第一次分离时,以中位数为临界,则快速排序的效率则大大提升。关于查找中位数问题后面再做谈论。