快排(韩顺平法)
还是韩顺平的数据结构,由于他讲的十分不清楚所以在这里记录一下。
代码如下:
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {4, 5, 3, 1, 2};
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 temp = 0;//临时变量,交换时使用
//pivot 中轴值
int pivot = arr[(left + right) / 2];
//while循环的目的是让比pivot值小的放到左边,大的放到右边
while (l < r) {
//在pivot左边一直找,直到找到大于等于pivot的值,再退出
while (arr[l] < pivot) {
l++;
}
//在pivot右边一直找,直到找到小于等于pivot的值,再退出
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--;
}
}
//如果l == r,必须l++, r--,否则栈溢出
if (l == r) {
l++;
r--;
}
//向左递归
if (left < r) {
quickSort(arr, left, r);
}
//向右递归
if (right > l) {
quickSort(arr, l, right);
}
}
}
其中他讲的不清楚的地方主要集中于以下两点:
if (arr[l] == pivot) {
r--;
}
if (arr[r] == pivot) {
l++;
}
这个判断语句主要是为了防止左边和右边有和pivot相等的值,同时让相等的值尽量和pivot靠的近一些。
if (l == r) {
l++;
r--;
}
这句判断是因为,如果不加判断,进行递归的时候会反复进行重复的递归造成栈溢出。比如剩12两个元素的时候,如果pivot, l, r一直在1的位置,会反复进行右递归。
本文来自博客园,作者:imissinstagram,转载请注明原文链接:https://www.cnblogs.com/LostSecretGarden/p/14708191.html

浙公网安备 33010602011771号