快排(韩顺平法)

还是韩顺平的数据结构,由于他讲的十分不清楚所以在这里记录一下。

代码如下:

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的位置,会反复进行右递归。

posted @ 2021-04-27 11:23  imissinstagram  Views(229)  Comments(0)    收藏  举报