经典快速排序
下方代码是最终的版本,注释处有的是开始写时犯的错误及其总结,有的是测试用的代码。
导入的工具类代码在最下方。
package edu.cyj._02;
import static edu.cyj.tools.Tools.*;
public class QuickSort {
public static void quickSort(int[] arr){
if (arr == null || arr.length < 2){
return;
}
quickSort(arr, 0, arr.length-1);
}
public static void quickSort(int[] arr, int L, int R){
// **** <1> ****
// L < R的条件确保了递归过程中,若数据条件特殊(如为{3, 3, 3, 3}),
//未发生swap(..., less++)操作,出去递归又传入less - 1 为R值,最坏情况less的值从0到了-1,也确保安全
//递归不会进入
if(L < R){
int[] nextLocation = partition(arr, L, R);
quickSort(arr, L, nextLocation[0]-1);
quickSort(arr, nextLocation[1]+1, R);
}
}
public static int[] partition(int[] arr, int L, int R){
int less = L; // less记录小于值,L记录小于等于的右边界
int r = R; // 最后需要交换arr[R]与arr[r],R不能变化
// 无法使用三目运算,有三种情况
// while (L < R){
// arr[L] > std?swap(arr, R, L)
// }
// **** <2> ****
// 当以L和R从两边趋近于数组中心,退出条件为L,R相遇时,
// 不要二者都是用x++/--,会导致中间有一个数访问不到
while (L < r){
// L < r mad 细心点
if(arr[L] > arr[R]){
swap(arr, L, --r);
}else if(arr[L] < arr[R]){
// System.out.println("发生了此步骤");
swap(arr, L++, less++);
}else L++;
}
swap(arr, R, r);
return new int[]{less, r};
}
public static void swap(int[] arr, int i, int c){
int tmp = arr[i];
arr[i] = arr[c];
arr[c] = tmp;
}
// public static void swap(int[] arr, int i, int c){
// **** <3> ****
// 位运算交换不可用在同一数组的两个相同索引处(同一位置),使得每个位置都为0
//
// arr[i] = arr[i] ^ arr[c];
// arr[c] = arr[c] ^ arr[i];
// arr[i] = arr[i] ^ arr[c];
// }
public static void main(String[] args) {
int maxSize = 100;
int maxValue = 100;
int testTimes = 1000;
boolean succeed = true;
for (int i = 0; i < testTimes; i++){
int[] arr1 = generateRandomArray(maxSize,maxValue);
int[] arr2 = copyArr(arr1);
quickSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)){
succeed = false;
break;
}
}
System.out.println(succeed == true?"bingo":"wrong answer");
int[] ar = {5, 2, 7, 9, 4, 1, 4, 2};
printArr(ar);
quickSort(ar);
printArr(ar);
// int[] ar = {3, 9 ,2, 1, 4, 5};
// printArr(ar);
// quickSort(ar);
// printArr(ar);
// }
}
//public static void main(String[] args) {
// int[] ar = {3, 3, 3, 3, 3};
// printArr(ar);
// quickSort(ar);
// printArr(ar);
//}
}
下面是工具类代码块
package edu.cyj.tools;
import java.util.Arrays;
public class Tools {
public static int[] copyArr(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;
}
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());
}
return arr;
}
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;
}
public static void printArr(int[] arr){
for (int i : arr){
System.out.print(i + " ");
}
System.out.println();
}
public static void comparator(int[] arr){
Arrays.sort(arr);
}
}