如何基于快速排序实现并行数组的双规则排序?
解决快速排序同步排序双数组:a降序,a相同时b升序的问题
我仔细看了你的代码,问题出在分区阶段的比较逻辑上——你现在的条件只考虑了a数组的降序,但没处理a元素相等时b数组升序的要求,而且原有的比较方向也搞反了,导致排序结果不符合预期。
原代码的核心问题
- 左指针
l的移动条件a[l] <= p逻辑写反:要实现降序,应该让比pivot大的元素留在左边,所以当a[l] > p时应该继续移动指针,直到遇到不符合的元素才停下。 - 右指针
h的移动条件a[h] >= p同样逻辑错误,且完全没考虑a元素相等时b数组的排序规则。 - 只保存了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); } }
关键逻辑解释
- 双值pivot:同时记录
pivot_a和pivot_b,确保a元素相等时能通过b值判断排序顺序。 - 指针移动规则:
- 左指针跳过所有“应该留在左边”的元素(a更大,或a相等但b更小),直到找到需要交换到右边的元素。
- 右指针跳过所有“应该留在右边”的元素(a更小,或a相等但b更大),直到找到需要交换到左边的元素。
- 同步交换:每次交换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
相关产品推荐
相关产品推荐

