适用于重复元素多的数据
😊加油,阿源你是最棒的
import java.util.Arrays;
//三向切分
public class Quick3way {
private Quick3way(){}
public static void sort(Comparable[] a){
sort(a, 0, a.length - 1);
}
private static void sort(Comparable[] a, int l, int h){
if (l >= h) return ;
int f = l;
Comparable p = a[l]; //这里a[l]的值永远等于基准点,可以不使用变量保存它的值,直接用a[l];当然这样减少了访问数组的次数
int i = l + 1;
int j = h;
while (i <= j){ //注意等号,确保每个元素都要判断到
int cmp = a[i].compareTo(p);
if (cmp < 0) exch(a, i++,f++); //从左边交换过来的值是小于等于p,所以下次不用判断,所以i++
else if (cmp > 0) exch(a, i, j--); //从右边交换过来的值不知道大小,所以i不能改变,下次循环需要再次判断
else i++;
}
sort(a, l, f - 1);
sort(a, j + 1, h);
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
public static void main(String[] args) {
Comparable[] a = new Comparable[]{3,2,6,4,7,5,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}