排序原理
1、首先设定一个分界值,通过该分界值将数组分成左右两部分
2、将大于或等于分界值的数据放到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归拍好右侧两个部分的数据排完序后,整个数组的排序也就完成了。
public static void main( String[] args ){
int[] arr = {12,3,5,7,2,22,44,11,23,9,10,27,25};
int lo =0 ;
int hi = arr.length -1;
//对子数组进行排序
sortSubArr(arr,lo,hi);
System.out.println(Arrays.toString(arr));
}
private static void sortSubArr(int[] arr, int lo, int hi) {
if (lo>=hi){
return;
}
//分组,返回分界值索引
int index = group(arr,lo,hi);
//左子组排序
sortSubArr(arr,lo,index-1);
//右子组排序
sortSubArr(arr,index+1,hi);
}
private static int group(int[] arr, int lo, int hi) {
//确定分界值
int key = arr[lo];
//定义左右指针
int left = lo;
int right = hi + 1;
//分组
while (true){
//右指针左移
while (key < arr[--right]){
if (right==lo){
break;
}
}
//左指针右移
while ( key > arr[++left]){
if (left==hi){
break;
}
}
if (left>=right){
break;
}
//交换左右指针位置元素
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
//交换分界值元素和临界点元素
int tmp = arr[right];
arr[right] = key;
arr[lo] = tmp;
return right;
}