DESKTOP-S9OHBDA_20200902-王东东

问题:

快速排序:

    public static void quickSort(int[] A, int left, int right) {
        // 进行判断,如果左边索引比右边索引要大,是不合法的,直接使用return 结束这个方法
        if (left > right) {
            return;
        }
        // 定义变量保存到基准数
        int base = A[left];
        // 定义变量x,指向最左边
        int x = left;
        // 定义变量y,指向最右边
        int y = right;
        // 当x和y不相遇的时候,在循环中进行检索
        while (x != y) {
            // 向由y从右往左检索比基准数小的,如果检索到比基准数小的就停下
            // 如果检索大比基准数大的或者相等的,就继续检索
            while (A[y] >= base && x < y) {
                y--;// 从右往左移动
            }
            // x从左往右移动
            while (A[x] <= base && x < y) {
                x++;// y从左往右移动
            }
            // x也停下了,y也停下了,然后交换x和y的位置的元素
            int temp = A[x];
            A[x] = A[y];
            A[y] = temp;
        }
        // 如果上面while循环的条件不成立,会跳出这个循环,往下执行
        // 如果这个条件不成立,说明x和y相遇了,交换基准数这个元素和相遇位置上的元素
        // 把相遇位置上的元素赋值给基准数这个位置上的元素
        A[left] = A[x];
        // 把基准数赋值给相遇位置上的元素
        A[x] = base;
        // 基准数在这里就归位了,左边的数字都比他小,右边的数字都比他大
        // 排基准数的左边
        quickSort(A, left, x - 1);
        // 排右边
        quickSort(A, y + 1, right);

解决:

我理解的算法:

首先,会把数组中最左边的数当做基准数,然后从两边进行检索,,先从右边检索比基准数小的数;再从左边检索比基准数大的数;如果检索到了就停下,然后交换这两个元素,然后再继续检索,如果两个数一旦相遇,就停下检索,把基准数和相遇位置上的元素交换,基准数和相遇位置上的数交换完成后,表示第一轮排序结束,然后再进行第二轮、第三轮。

吐槽:

最近上课睡意来了,我可能提前要进入秋眠状态了。 ~~~,不、不、不,撑几个月,直接冬眠。

标签


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1