首页 > 编程语言 >经典算法之快排

经典算法之快排

时间:2022-08-15 13:55:27浏览次数:60  
标签:10 index 之快 交换 int 算法 经典 排序 left

快排的复杂度


快排逻辑

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

  1. 首先设定一个分界值(基准值),通过该分界值将数组分成左右两部分。
  2. 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
  3. 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
  4. 重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

代码实现

    public int[] quickSort(int[] arr, int left, int right) {
        // left 左边界
        // right 右边界
        if (left < right) {
            int partitionIndex = partition(arr, left, right);
            quickSort(arr, left, partitionIndex - 1);
            quickSort(arr, partitionIndex + 1, right);
        }
        return arr;
    }

    private int partition(int[] arr, int left, int right) {
        // 设定基准值(pivot)
        int pivot = left;
        int index = pivot + 1;
        // index 记录数组中比基准数小的数的 最大数组下标
        for (int i = index; i <= right; i++) {
            // 小于目标值基准值 交换位置
            if (arr[i] < arr[pivot]) {
                swap(arr, i, index);
                index++;
            }
        }
        swap(arr, pivot, index - 1);
        return index - 1;
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

排序演示

假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。

  1. 选择5(下标为0)为基准值,index下标从1开始,i为1,第一次循环 则为 5,3,7,6,4,1,0,2,9,10,8。
  2. index下标为2,i为2,第2次循环(7 > 5) 则不进行交换排序为 5,3,7,6,4,1,0,2,9,10,8。
  3. index = 2,i = 3, 3次 (6 > 5) 不交换 5,3,7,6,4,1,0,2,9,10,8。
  4. index = 2,i = 4, 4次 (4 < 5) 交换 5,3,4,6,7,1,0,2,9,10,8。
  5. index = 3,i = 5, 5次 (1 < 5) 交换 5,3,4,1,7,6,0,2,9,10,8。
  6. index = 4,i = 6, 6次 (0 < 5) 交换 5,3,4,1,0,6,7,2,9,10,8。
  7. index = 5,i = 7, 7次 (2 < 5) 交换 5,3,4,1,0,2,7,6,9,10,8。
  8. index = 6,i = 8, 8次 (9 > 5) 不交换 5,3,4,1,0,2,7,6,9,10,8。
  9. index = 6,i = 9, 9次 (10 > 5) 不交换 5,3,4,1,0,2,7,6,9,10,8。
  10. index = 6,i = 10, 10次 (8 > 5) 不交换 5,3,4,1,0,2,7,6,9,10,8。
    for 循环结束
    最后一次交换
  11. index = 6,pivot = 0, 10次 (2 > 5) 交换 2,3,4,1,0,5,7,6,9,10,8。

标签:10,index,之快,交换,int,算法,经典,排序,left
From: https://www.cnblogs.com/Spoonblog/p/16588065.html

相关文章

  • 接口测试经典面试题:Session、cookie、token有什么区别?
    原文链接HTTP是一个没有状态的协议,这种特点带来的好处就是效率较高,但是缺点也非常明显,这个协议本身是不支持网站的关联的,比如https://ceshiren.com/和https://ceshiren.co......
  • SHA256加密算法
    https://www.cnblogs.com/zhangwuxuan/p/12863273.html算法介绍:比特币挖矿的御用算法SHA256是SHA-2下细分出的一种算法SHA-2,名称来自于安全散列算法2(英语:SecureHashA......
  • 一文带你弄懂 JVM 三色标记算法!
    大家好,我是树哥。最近和一个朋友聊天,他问了我JVM的三色标记算法。我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用......
  • my2sql工具之快速入门
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。my2sql工具之快速入门1.什么是my2sql2.如......
  • C++ 特殊矩阵的压缩存储算法
    1.前言什么是特殊矩阵?C++,一般使用二维数组存储矩阵数据。在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵......
  • CAD设置经典模式
    1、打开桌面CAD2020软件,点击开始绘制。2、点击最上面的倒三角,下拉,点击【显示菜单栏】; 3、点击菜单栏的【工具】,点击【选项板】,点击【功能区】,关闭功能区;  4、......
  • 算法学习之路 离散化
    //离散化值得就是一一对应的关系,通常处理大数据范围中的小范围数据;离散化的中的两个步骤:1.a[]中可能的重复元素(去重)2.如何算出x离散化之后的值(二分)/*离散化模板......
  • (未完)【算法学习笔记】04 最近公共祖先LCA
    【算法学习笔记】04最近公共祖先LCA原理顾名思义,就是求两点的最近公共祖先(自己也是自己的祖先)。也就是两点在走到根节点的路径上最先遇到的共同的点。向上标记法比较......
  • 详解二分查找算法 && leetcode35. 搜索插入位置
    https://blog.csdn.net/weixin_39126199/article/details/118785065 https://leetcode.cn/problems/search-insert-position/classSolution{public:intsearc......
  • ISP开源算法
      awesome-ISP https://github.com/starkfan007/awesome-ISP ExamplesopenISP--OpenImageSignalProcessor [code]fast-openISP--FastOpenImageSigna......