/*
* 与最右边的数比较,
* 小于的放在左边
* 大于的放在右边
* 等于的放在中间
*/
public static int[] netherlandsFlag(int[] arr, int L, int R){
if(L>R){
return new int[]{-1,-1};
}
if(L == R){
return new int[]{L,R};
}
int less = L-1;
int more = R;
int index = L;
while(index<more){
if(arr[index] == arr[R]){
index++;
}else if(arr[index] < arr[R]){
swap(arr,++less,index++);
}else if(arr[index] > arr[R]){
swap(arr,--more,index);
}
}
swap(arr,R,more);
return new int[]{less+1,more};
}
引出快速排序
public class QuickSortTest {
public static void main(String[] args) {
int[] arr = {5,3,7,2,0,3,4,1,5};
quicksort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void quicksort(int[] arr, int L, int R){
if(L >= R){
return;
}
swap(arr, L+(int)Math.random()*(R-L+1),R); // 随机选择一个数,和最后一个数交换
int[] nether = netherlandsFlag(arr,L,R);
quicksort(arr,L,nether[0]-1);
quicksort(arr,nether[1]+1,R);
}
private static void swap(int[] arr, int h, int t){
int temp = arr[h];
arr[h] = arr[t];
arr[t] = temp;
}
/*
* 与最右边的数比较,
* 小于的放在左边
* 大于的放在右边
* 等于的放在中间
*/
public static int[] netherlandsFlag(int[] arr, int L, int R){
if(L>R){
return new int[]{-1,-1};
}
if(L == R){
return new int[]{L,R};
}
int less = L-1;
int more = R;
int index = L;
while(index<more){
if(arr[index] == arr[R]){
index++;
}else if(arr[index] < arr[R]){
swap(arr,++less,index++);
}else if(arr[index] > arr[R]){
swap(arr,--more,index);
}
}
swap(arr,R,more);
return new int[]{less+1,more}; // 等于区域的范围
}
}