0
点赞
收藏
分享

微信扫一扫

快速排序算法回顾---(韩顺平数据结构)笔记

写心之所想 2022-02-12 阅读 61

快速排序(是对冒泡排序的一次改进)

阈值情况考虑

  1. 会碰到 交换数据的时候,交换到中间的值,意即为会车
    • 如果碰到 left = = 中间值 则需要 r–
    • 如果碰到 right = =中间值 则需要 l++
  2. 防止栈溢出 当遍历到 left == right值的时候,需要将其错开继续遍历下去
  3. 需进行左递归和右递归

算法解析

在这里插入图片描述
在这里插入图片描述

算法演示

 public static void sort(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 += 1;
            }
            // 一直遍历直到找到 比 中轴值小的数字
            while (arr[r] > pivot) {
                r -= 1;
            }
            // 如果左下标 大于 右下标 说明已经遍历完毕了 需要结束遍历
            if (l >= r) {
                break;
            }
            // 交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;

            // 交换完毕 如果该值 等于中轴值 则需 将右下标往前推进
            if (arr[l] == pivot) {
                r -= 1;
            }
            // 交换完毕 如何该值  等于中轴值 则需 将左下标往后推进
            if (arr[r] == pivot) {
                l += 1;
            }
        }

        // 防止栈溢出
        if (l == r) {
            l += 1;
            r -= 1;
        }

        // 如果一直满足如下条件 , 则向左遍历
        if (left < r) {
            sort(arr, left, r);
        }
        // 如果一直满足如下条件 , 则向右遍历
        if (right > l) {
            sort(arr, l, right);
        }
    }

算法测试

 public static void main(String[] args) {
        int [] arr = {23,4,5,12,3,54,23,54,4};
        sort(arr,0,arr.length - 1);
        System.out.println(Arrays.toString(arr));

    }

算法结果

在这里插入图片描述

举报

相关推荐

0 条评论