1、介绍
是冒泡排序的一种改进,是一种空间换时间的一种实现方式,本章采用的是递归调用
2、实现思路
通过对待排序的序列数据以中间值分割成两部分,一部分的数据比另一部分的数据都要小,然后再通过这种方式分别对这两部分序列以这种思路再进行快速排序
3、代码实现
package com.lyw.review510;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
// 记录左边索引
int l = left;
// 记录右边索引
int r = right;
// 记录中间值
int pivot = arr[(left + right) / 2];
// 临时变量
int temp = 0;
while (l < r) {
// 当左边的值比中间值大,跳出循环,记录当前索引值
while (arr[l] < pivot) {
l++;
}
// 当有边的值比中间值小,跳出循环,记录当前索引值
while (arr[r] > pivot) {
r--;
}
// 如果左边的值大于等于了右边的值,说明已经比较完了
if (l >= r) {
break;
}
// 数据交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
/**
* 这里是为了防止左边的一个值刚好和中间值相等,这时会和右边的值互换
* 右边交换之后的值也与中间值相等,所以需要移动下索引
*/
if (arr[l] == pivot) {
l--;
}
if (arr[r] == pivot) {
r--;
}
}
// while循环结束之后,如果 l == r ,这时我们需要把中间值左边的在递归排序 r--,这时的r变成了左边序列的最后一个索引
// l++ ,就变成了右边序列的开始索引
if (l == r) {
l++;
r--;
}
// 向左递归
// 这时的r是中间值的前一个位置,所以左递归就是0 ~ r(pivot -1)的位置
if (left < r) {
quickSort(arr, left, r);
}
// 进行右递归
if (right > l) {
quickSort(arr, l, right);
}
}
}
仅供参考