/**
* 快速排序
* 在arr中指定一个数k 在数组中划分3个区域 >k; ==k; <k;
* 递归
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{13, 334, 23, 5, 34, 23, 4, 65, 7, 4, 5, 23, 4, 565, 76, 4, 54, 53, 45, 234, 54};
quickSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void quickSort(int[] arr) {
if (arr != null && arr.length < 2) {
return;
}
process(arr, 0, arr.length - 1);
}
public static void process(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int[] midArea = patition(arr, left, right);
process(arr, left, midArea[0] - 1);
process(arr, midArea[1] + 1, right);
}
//分为3个区域 返回 == k 的区域左右两个下标
public static int[] patition(int[] arr, int left, int right) {
//如果左下标大于右 则返回[-1,-1]
if (left > right) {
return new int[]{-1, -1};
}
if (left == right) {
return new int[]{left, right};
}
int leftR = left - 1;//左边区域的有边界 即<k区域的有边界
int rightL = right;//>k的左边界
int cur = left;
//把数组最右位置的数作为k来比较
while (cur < rightL) {
if (arr[cur] == arr[right]) {
cur++;
} else if (arr[cur] < arr[right]) {
//swap(arr, leftR + 1, cur);
//leftR++;
//cur++;
swap(arr, ++leftR, cur++);
} else if (arr[cur] > arr[right]) {
//swap(arr,cur,rightL - 1);
//rightL--;
swap(arr, cur, --rightL);
}
}
swap(arr, rightL, right);
return new int[]{leftR + 1, rightL};
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
排序--快速排序
最新推荐文章于 2024-06-14 15:02:13 发布