//判断a是否小于b
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
//两个交换
private static void swap(Comparable arr[], int i, int j) {
Comparable tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
//进行数组中的排序
private static void sort(Comparable arr[]) {
//第一个数的索引
int low = 0;
//最后一个数的索引
int high = arr.length - 1;
sort(arr, low, high);
}
//对arr数组中 low到high进行排序
private static void sort(Comparable arr[], int low, int high) {
//要排序的子数组,low比high都大了 说明 该数组只剩一个值,无法在交换了
if (high<=low){
return;
}
//需要对数组中low-high 中的元素进行分组,分为左子组,右子组
int partition = partition(arr, low, high); //返回分界的那个值的索引
//让左子组有序
sort(arr, low, partition - 1);
//让右子组有序
sort(arr, partition + 1, high);
}
//进行分组的方法
private static int partition(Comparable arr[], int low, int high) {
//确定分界值
Comparable key = arr[low];
//定义两个指针,指向待切分数组的最小索引和最大索引
int left = low;
int right = high + 1;
//切分 需要进行扫描 扫描多少次呢 使用
while (true) {
//先从右往左扫描,移动right指针,找到一个比分界值小的元素,停止
//元素比分界大,不是目标元素,指针就一直左移,
while (less(key, arr[--right])) {
//如果到了最左边也没找到,退出
if (right == low) {
break;
}
}
//在从左往右扫描,移动left指针,找到一个比分界值大的元素,停止
//向右移动 找比key大的值
while (less(arr[++left], key)) {
//如果到了最左边也没找到,退出
if (left == high) {
break;
}
}
//判断left》=right,如果是 元素扫描完毕结束循环
if (left >= right) {
//说明扫描完毕了
break;
} else {
//没有扫描完,说明 比key 大的和比key小的 都需要交换位置
swap(arr, left, right);
}
}
//整个循环结束 找到了分界值的索引 ,将基准与分界值的位置换掉,交换分界值
swap(arr, low, right);
return right;
}
public static void main(String[] args) {
Integer[] integers= {6, 1, 2, 7, 9, 3, 4, 5, 8};
sort(integers);
System.out.println(Arrays.toString(integers));
}