算法通关村第十关 | 快速排序

1.快速排序的基本过程

快速排序是分治法运用到排序问题的典型例子,基本思想是 :通过一个标记pivot 元素将n个元素的序列划分为左右两个子序列left和right,其中left中的元素都比pivot小right的都比pivot的大 ,然后再次对left和right各自再执行快速排序,第一次的pivot不参与,将左右子序列运用同样的方法排序,知道最后剩余一个元素的时候结束,(其中的pivot这里用数组中间的元素)。

双指针移动:

left: arr[left] < pivot时,不移动,arr[left] > pivot时,left++

right: arr[right] > pivot时,不移动,否则,right--

代码实现:

java 复制代码
    public void quickSort(int[] arr,int start,int end){
        if (start >= end){
            return;
        }
        //这里就是一个对撞的双指针
        int left = start,right = end;
        int pivot = arr[(start + end) / 2];
        while (left <= right){
            while (left <= right && arr[left] < pivot){
                left++;
            }
            while (left <= right && arr[right] > pivot){
                right--;
            }
            if (left <= right){
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
                left++;
                right--;
            }
        }
        //分别处理其左右部分
        //此时的left和right在pivot的两边
        quickSort(arr,start,right);
        quickSort(arr,left,end);
    }

复杂度分析:

如果我们每次选的pivot每次都正好在中间,效率时最高的,但是这是无法保证的,因此我们需要从最好、最坏和中间情况来分析。

  • 最坏情况就是每次选择的恰好是left节点作为pivot,如果元素恰好都是逆序的,此时间复杂度为O(n^2)

  • 如果元素恰好是有序的,时间复杂度为O(n)

  • 每次选择的都是中间结点,此时序列每次都是长度相等的列,此时的时间复杂度为O(nlogn)

相关推荐
历程里程碑3 分钟前
二叉树---二叉树的最大深度
大数据·数据结构·算法·elasticsearch·搜索引擎·全文检索·深度优先
自我意识的多元宇宙4 分钟前
树与二叉树--树的基本概念
数据结构·算法
吃着火锅x唱着歌5 分钟前
LeetCode 678.有效的括号字符串
算法·leetcode·职场和发展
夜悊1 小时前
顺序栈和链栈的C/C++语言描述实现模板
数据结构
音视频牛哥1 小时前
鸿蒙 NEXT RTSP/RTMP 播放器如何回调 RGB 数据并实现 AI 视觉算法分析
人工智能·算法·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
飞Link1 小时前
掌控 Agent 的时空法则:LangGraph Checkpoint (检查点) 机制深度实战
开发语言·python·算法
乐迪信息1 小时前
智慧港口中AI防爆摄像机的船舶越线识别功能
大数据·人工智能·物联网·算法·目标跟踪
m0_716765231 小时前
数据结构--单链表的插入、删除、查找详解
c语言·开发语言·数据结构·c++·笔记·学习·visual studio
F_D_Z1 小时前
扩散模型快速采样:从渐进蒸馏到并行推理
人工智能·算法·加速采样
睡一觉就好了。2 小时前
哈希表(一)
算法·散列表