public class Quick {
public static void sort(Comparable []a){
sort(a,0,a.length-1);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (hi<=lo+M){ //M值用具体的数字替换5-15之间使用插入算法效率更高
Insertion.sort(a);
return;
}
int j = partition(a,lo,hi);
sort(a,lo,j-1);
sort(a,j+1,hi);
}
private static int partition(Comparable[] a, int lo, int hi) {
int i = lo;
int j =hi+1;
Comparable v = a[lo];
while (true){
while (less(a[++i],v)){
if (i == hi) break;
}
while (less(v,a[--j])){
if (j == lo) break;
}
if (i >= j)
break;
exch(a,i,j);
}
exch(a,i,lo);
return i;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private static boolean less(Comparable v, Comparable m) {
return v.compareTo(m) < 0;
}
private static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
String[] a = {"Q","U","I","C","K","S","O","R","T","E","X","A","M","P","L","E"};
show(a);
sort(a);
show(a);
}
}
public class Insertion {
public static void sort(Comparable []a){
for (int i = 1; i < a.length; i++) {
for (int j = i; j >0 && less(a[j],a[j-1]) ; j--) {
exch(a,j,j-1);
}
}
}
public static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static boolean less(Comparable v, Comparable m) {
return v.compareTo(m) < 0;
}
public static void show(Comparable[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
基本原理:
先随机打乱数组,选出数组的其中一个值(我们称为切分元素),将数组按切分值大小分为两组,然后将左右两组分别进行升序操作
其中随机打算数组的原因:主要是为了防止每次切分数组时可能会出现切分元素都是最小值的情况
当数组元素比较少时,即个数大约为5-却个时建议用插入排序,会大大提高效率