思路:
将一个数组按照一个参照数字分为两部分,一部分是小于这个数的,一部分是大于这个数的。然后通过递归在对每一侧的数组进行这种划分。直到排序完成。
public class Sort2 {
public static int partition(int[] array,int left,int right){
/*
设置两个指针,分别指向数组的左边和右边。然后移动指针。当左侧出现比参照数大的数时
停止指针的移动。右边指针向左移动,当存在指针的数比参照数小的数时停止移动指针。
然后将量个数交换
*/
int leftPtr=left-1;
int rightPtr=right;
int flag=array[right];
while (true){
while (rightPtr>leftPtr && array[++leftPtr]<flag);
while (rightPtr>leftPtr && array[--rightPtr]>flag);
if (rightPtr<=leftPtr){
break;
}else {
int tmp = array[leftPtr];
array[leftPtr] = array[rightPtr];
array[rightPtr] = tmp;
}
}
//将参照数与较大的数进行交换
int tmp = array[leftPtr];
array[leftPtr] = array[right];
array[right] = tmp;
return leftPtr;
}
public static void doSort(int[] array,int left,int right){
if (left>=right){
return;
}else{
int partition = partition(array,left,right);
doSort(array,left,partition-1);
doSort(array,partition+1,right);
}
}
public static void main(String[] args) {
int[] array = new int[10];
for (int i=0;i<array.length;i++){
array[i] = (int) (Math.random() * 99);
}
for (int i : array) {
System.out.print(i+" ");
}
System.out.println();
doSort(array, 0, array.length-1);
for (int i : array) {
System.out.print(i+" ");
}
}
}