排序算法——快速排序:普通快排与双路快排

快速排序:

普通快排:

选取待排序数组的首或尾元素作为枢轴(就是base,我们选出来的比较的数),大于base的放右边,小于base的放左边。

java 复制代码
public void quickSort(int[] nums, int low, int high) {
    if (low >= high) return;
    int base = nums[low];//基准元素
    int lIndex = low, rIndex = high;//lIndex是需要交换的最左元素下标,rIndex是最右元素下标
    while (lIndex < rIndex) {
        while(lIndex < rIndex && nums[rIndex] >= base) rIndex--;
        while(lIndex < rIndex && nums[lIndex] <= base) lIndex++;
        if(lIndex < rIndex) {
            swap(nums, lIndex, rIndex);
        }
    }
    //经过以上处理得到的lIndex就是base应该放置的下标
    swap(nums, lIndex, low);
    quickSort(nums, low, lIndex - 1);//分别对base的左右两侧快排
    quickSort(nums, lIndex + 1, high);
}
private static void swap(int[] nums, int index1, int index2) {
    int temp = nums[index1];
    nums[index1] = nums[index2];
    nums[index2] = temp;
}

很显然对于普通的快排来说只能处理大于base和小于base的情况,对于等于base的情况我们是做的模糊处理(哪边先碰到算哪边的),所以在待排序数组中元素重复度比较高的情况下会退化为O(n^2)。如:4,4,4,4,4,1

我们每次只能一个元素一个元素的拆开,而不是理想情况一半一半的拆,为了处理以上情况有了双路快排。

双路快排:

java 复制代码
void doubleQuicklySort(int[] nums, int low, int high) {
	if(low >= high) return;
	//index1是左往右(除base外)第一个大于等于base的数的下标
	//index2是右往左第一个小于等于base的数的下标
    int base = nums[low], index1 = low + 1, index2 = high;
    while(true) {
        while(index1 < index2 && nums[index2] > base) index2--;
        while(index1 < index2 && nums[index1] < base) index1++;
        if(index1 >= index2) break;
        swap(nums, index1, index2);
        //交换完后我们认为符合左右两边的规律性,所以下一次开始的时候需要从两个下标的后一位开始
        index1++;
        index2--;
    }
    /*
    因为上面while中的交换是为了让nums[low](第一个>=base的)和nums[index2](第一个<=base的互换)来保证左右两边的规律性,
    但是如果在上面第一个while中对于index2的更新因为不满足(index1 < index2)的条件而退出,不是因为不满足(nums[index2] > base),
    所以就有可能导致index2指向的数仍然是>=base的所以就没必要调换  eg:3 4 4 5 6可以用这个例子理解
    */
    if(nums[index2] < base)
        swap(nums, low, index2);
        
    doubleQuicklySort(nums, low, index2-1);
    doubleQuicklySort(nums, index2, high); 
}
相关推荐
Coovally AI模型快速验证4 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun4 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao344 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11334 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆5 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路6 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗7 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者8 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy8 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率
CoovallyAIHub9 小时前
为高空安全上双保险!无人机AI护航,YOLOv5秒判安全带,守护施工生命线
深度学习·算法·计算机视觉