package demo1;
import java.sql.Array;
import java.util.Stack;
//快速排序
public class demo4 {
public static void splitnum1(int[] arr) {
int N = arr.length - 1;
int lessR = -1;
int index = 0;
while (lessR < N) {
if (arr[index] <= arr[N]) {
swap(arr, ++lessR, index++);
} else {
index++;
}
}
}
public static void splitnum2(int[] arr) {
int N = arr.length - 1;
int lessR = -1;
int moreL = N;
int index = 0;
while (lessR < moreL) {
if (arr[index] < arr[N]) {
swap(arr, ++lessR, index++);
} else if (arr[index] > arr[N]) {
swap(arr, --moreL, index);
} else {
index++;
}
}
swap(arr, moreL, N);
}
public static int[] splitnum(int[] arr, int L, int R) {
// int N = arr.length - 1;
int lessR = L-1;
int moreL = R;
int index = L;
while (index < moreL) {
if (arr[index] < arr[R]) {
swap(arr, ++lessR, index++);
} else if (arr[index] > arr[R]) {
swap(arr, --moreL, index);
} else {
index++;
}
}
swap(arr, moreL, R);
return new int[] {lessR,moreL+1};
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void quickSort1(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
process1(arr, 0, arr.length - 1);
}
public static void process1(int[] arr, int L, int R) {
if(L>=R){
return;
}
int[] splitnum = splitnum(arr, L, R);
process1(arr,L , splitnum[0]);
process1(arr, splitnum[1], R);
}
public static void quickSort2(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
Stack<Job> stack=new Stack<>();
stack.push(new Job(0, arr.length-1));
while (!stack.isEmpty()){
Job cur=stack.pop();
int[] splitnum = splitnum(arr, cur.L, cur.R);
if(splitnum[0]> cur.L){
stack.push(new Job(cur.L, splitnum[0]));
}
if(splitnum[1]< cur.R){
stack.push(new Job(splitnum[1], cur.R));
}
}
}
public static class Job {
public int L;
public int R;
public Job(int left, int right) {
L = left;
R = right;
}
}
// for test
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
// for test
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
// for test
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
// for test
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
// for test
public static void main(String[] args) {
// int[] arr = { 7, 1, 3, 5, 4, 5, 1, 4, 2, 4, 2, 4 };
//
// splitNum2(arr);
// for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i] + " ");
// }
int testTime = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
System.out.println("test begin");
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
// int[] arr3 = copyArray(arr1);
quickSort1(arr1);
quickSort2(arr2);
// quickSort3(arr3);
if (!isEqual(arr1, arr2) ) {
System.out.println("Oops!");
succeed = false;
break;
}
}
System.out.println("test end");
System.out.println(succeed ? "Nice!" : "Oops!");
}
}
算法第十三节 快速排序
于 2022-07-08 22:06:34 首次发布