package sort;
public class Quick {
/*
* 比较v元素是否<w元素
* */
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
/* 数组元素i和j交换位置
* */
private static void exch(Comparable[]a,int i,int j){
Comparable t= a[i];
a[i]=a[j];
a[j]=t;
}
/*
* 对数组内元素进行排序
* */
public static void sort(Comparable[] a){
int lo=0;
int hi=a.length-1;
sort(a,lo,hi);
}
/*
* 对数组a中从索引lo到索引hi之间元素进行排序
* */
private static void sort(Comparable[]a,int lo,int hi){
// 安全性检验
if(lo>=hi){
return;
}
// 需要对数组中lo索引到hi索引处元素进行分组(左子组,右子组)
int pivot_index = partition(a, lo, hi); // 返回的是分组的分界值的索引
// 让左子组有序
sort(a, lo, pivot_index-1);
// 让右子组有序
sort(a,pivot_index+1,hi);
}
// 对数组a中从索引lo到索引hi之间元素进行分组,并返回分组界限对应的索引
public static int partition(Comparable[]a,int lo,int hi){
// 确定分界值
Comparable key= a[lo];
// 定义两个指针,分别指向带切分元素最小索引处,和最大索引处下一个位置
int left=lo;
int right=hi+1;
// 切分
while (true){
// 先从右往左扫描移动right指针找到key>a[--right] 停止
while (less(key,a[--right])){
if(right==lo){
break;
}
}
// 先从左往右扫描移动left指针找到比分界值大的元素
while (less(a[++left],key)){
if(left==hi){
break;
}
}
// 判断left>=right 如果是证明扫描完毕结束循环 ,如果不是交换元素即可
if(left>=right){
break;
}
else {
// 交换位置
exch(a,left,right);
}
}
// pivot索引元素 与 right处索引交换
exch(a,lo,right);
return right;
}
}
public class QuickTest {
public static void main(String[] args) {
Integer[] arr={4,1,19,2,7,3,21,5,32,12};
Quick.sort(arr);
System.out.println(Arrays.toString(arr));
}
}