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

如何基于快速排序实现并行数组的双规则排序?

解决快速排序同步排序双数组:a降序,a相同时b升序的问题

我仔细看了你的代码,问题出在分区阶段的比较逻辑上——你现在的条件只考虑了a数组的降序,但没处理a元素相等时b数组升序的要求,而且原有的比较方向也搞反了,导致排序结果不符合预期。

原代码的核心问题

  1. 左指针l的移动条件a[l] <= p逻辑写反:要实现降序,应该让比pivot大的元素留在左边,所以当a[l] > p时应该继续移动指针,直到遇到不符合的元素才停下。
  2. 右指针h的移动条件a[h] >= p同样逻辑错误,且完全没考虑a元素相等时b数组的排序规则。
  3. 只保存了pivot的a值,没保存对应的b值,没法处理a相等时的b比较逻辑。

修改后的代码

我们需要把a[]和b[]的组合作为排序键:优先按a降序,a相等时按b升序。调整后的完整代码如下:

void qsort1(double a[], int b[], int lo, int hi) {
    int l, h, pivot_b, t1;
    double pivot_a, t;
    if (lo < hi) {
        l = lo;
        h = hi;
        // 同时保存pivot的a和b值,用于后续双条件比较
        pivot_a = a[hi];
        pivot_b = b[hi];
        
        do {
            // 左指针:找需要放到右边的元素
            // 停止条件:a[l] < pivot_a(比pivot小,该去右边),或a相等但b[l] > pivot_b(b大,该去右边)
            while ((l < h) && !(a[l] < pivot_a || (a[l] == pivot_a && b[l] > pivot_b))) {
                l++;
            }
            // 右指针:找需要放到左边的元素
            // 停止条件:a[h] > pivot_a(比pivot大,该去左边),或a相等但b[h] < pivot_b(b小,该去左边)
            while ((h > l) && !(a[h] > pivot_a || (a[h] == pivot_a && b[h] < pivot_b))) {
                h--;
            }
            if (l < h) {
                // 交换a数组对应元素
                t = a[l];
                a[l] = a[h];
                a[h] = t;
                // 同步交换b数组对应元素,保证关联关系不变
                t1 = b[l];
                b[l] = b[h];
                b[h] = t1;
            }
        } while (l < h);
        
        // 将pivot放到正确的位置,同步更新b数组
        a[hi] = a[l];
        a[l] = pivot_a;
        b[hi] = b[l];
        b[l] = pivot_b;
        
        // 递归排序左右子数组
        qsort1(a, b, lo, l - 1);
        qsort1(a, b, l + 1, hi);
    }
}

关键逻辑解释

  1. 双值pivot:同时记录pivot_a和pivot_b,确保a元素相等时能通过b值判断排序顺序。
  2. 指针移动规则:
    • 左指针跳过所有“应该留在左边”的元素(a更大,或a相等但b更小),直到找到需要交换到右边的元素。
    • 右指针跳过所有“应该留在右边”的元素(a更小,或a相等但b更大),直到找到需要交换到左边的元素。
  3. 同步交换:每次交换a数组元素时,必须同步交换对应的b元素,保证两个数组的索引关联关系始终一致。

测试你的示例

初始数组:

  • a = [10, 15, 20, 15]
  • b = [1, 2, 3, 4]

排序后结果:

  • a = [20, 15, 15, 10]
  • b = [3, 2, 4, 1]

完全符合你的目标要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:16:26