import java.util.Arrays;
import java.util.Random;
public class RandomQuickSortTest {
public static void main(String[] args) {
for(int i=0;i<10000;i++){
int[] arr = generalRandomArray(1000);
int[] arr2 = Arrays.copyOf(arr, arr.length);
Arrays.sort(arr2);
myQuicksort(arr,0,arr.length-1);
compare(arr,arr2);
}
}
private static int[] generalRandomArray(int size) {
int[] arr = new int[size];
for(int i=0;i<size;i++){
arr[i] = Math.abs(new Random().nextInt(10000));
}
return arr;
}
//对数器
private static void compare(int[] arr1, int[] arr2) {
if(arr1.length!=arr2.length){
System.err.println("大小不一样,arr1.length="+arr1.length+",arr2.length="+arr2.length);
}
for(int i=0;i<arr1.length;i++){
if(arr1[i]!=arr2[i]){
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
System.out.println();
}
}
}
private static void myQuicksort(int[] arr,int a,int b) {
if(a>=b){
return;
}
int[] res = partition(arr,a,b);
myQuicksort(arr,a,res[0]-1);
myQuicksort(arr,res[1]+1,b);
}
private static int[] partition(int[] arr, int a, int b){
// 1,3,2,6,4,8,9
//small a b big
// i------------i
/**
* 1.如果当前数<num:当前数<->左区往右一个数,small++,i++
* 2.如果当前数==num:i++
* 3.如果当前数>num:当前数<->右区左一个数,big--
*/
int smallIndex = a-1;
int bigIndex = b+1;
int num = arr[Math.abs(new Random().nextInt(b-a)+a)];
int currentIndex = a;
while(true){
if(currentIndex>=bigIndex){
break;
}
if(arr[currentIndex]<num){
swap(arr,smallIndex+1,currentIndex);
smallIndex++;
currentIndex++;
}else if(arr[currentIndex]==num){
currentIndex++;
}else{
swap(arr,bigIndex-1,currentIndex);
bigIndex--;
}
}
int[] res = new int[2];
res[0] = smallIndex+1;
res[1] = bigIndex-1;
return res;
}
private static void swap(int[] arr,int a,int b){
int t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
}
随机快排的java实现
最新推荐文章于 2022-11-23 15:29:48 发布