You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改升序Quick Sort算法实现数组降序排序?

快速排序从升序改降序的修改方案

嘿,我来帮你搞定这个快速排序转降序的问题!其实改动非常简单,只需要调整分区阶段的两个比较条件就可以了,核心逻辑完全不用动。

先回顾你现有升序快排的核心分区逻辑:

原代码里的两个while循环,是在找不符合升序规则的元素:

  • 第一个循环从左往右找**大于等于基准值(pivot)**的元素(因为升序要求左边都是小于pivot的)
  • 第二个循环从右往左找小于等于基准值的元素(因为升序要求右边都是大于pivot的)
    找到后交换这两个元素,最终把pivot放到正确的位置,再递归处理左右子数组。

要改成降序,只需要把这两个比较条件反转:

需要修改的两处代码

  1. 第一个while循环的条件:
    原升序代码:while ((data[i] < pivot) && (i < right)) i++;
    改降序后:while ((data[i] > pivot) && (i < right)) i++;
    (现在是从左往右找小于等于pivot的元素,因为降序要求左边都是大于pivot的)

  2. 第二个while循环的条件:
    原升序代码(补全你截断的部分):while ((data[j] > pivot) && (j > left)) j++;
    改降序后:while ((data[j] < pivot) && (j > left)) j++;
    (现在是从右往左找大于等于pivot的元素,因为降序要求右边都是小于pivot的)

修改后的完整代码示例

public static void Quick_Sort(ref double[] data, int left,int right, ref int count) 
{ 
    int i; 
    int j; 
    double pivot; 
    double temp; 

    i = left; 
    j = right; 
    pivot = data[(left + right) / 2]; 

    do 
    { 
        // 改动1:把 < 改成 >
        while ((data[i] > pivot) && (i < right)) 
            i++; 
        count++; 

        // 改动2:把 > 改成 <
        while ((data[j] < pivot) && (j > left)) 
            j++; 
        count++; 

        if (i <= j) 
        { 
            temp = data[i]; 
            data[i] = data[j]; 
            data[j] = temp; 
            i++; 
            j--; 
        } 
    } while (i <= j); 

    if (left < j) 
        Quick_Sort(ref data, left, j, ref count); 
    if (i < right) 
        Quick_Sort(ref data, i, right, ref count); 
}

逻辑解释

降序快排的分区逻辑和升序相反:我们需要把大于基准值的元素放到左边,小于基准值的元素放到右边,所以只要反转两个循环里的比较符号,就能让分区逻辑适配降序需求。其他的交换、递归逻辑完全不需要改动,因为它们只是在处理找到的不符合规则的元素,以及递归处理子数组。

内容的提问来源于stack exchange,提问作者Craig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:39:09