如何修改升序Quick Sort算法实现数组降序排序?
快速排序从升序改降序的修改方案
嘿,我来帮你搞定这个快速排序转降序的问题!其实改动非常简单,只需要调整分区阶段的两个比较条件就可以了,核心逻辑完全不用动。
先回顾你现有升序快排的核心分区逻辑:
原代码里的两个
while循环,是在找不符合升序规则的元素:
- 第一个循环从左往右找**大于等于基准值(pivot)**的元素(因为升序要求左边都是小于pivot的)
- 第二个循环从右往左找小于等于基准值的元素(因为升序要求右边都是大于pivot的)
找到后交换这两个元素,最终把pivot放到正确的位置,再递归处理左右子数组。
要改成降序,只需要把这两个比较条件反转:
需要修改的两处代码
第一个
while循环的条件:
原升序代码:while ((data[i] < pivot) && (i < right)) i++;
改降序后:while ((data[i] > pivot) && (i < right)) i++;
(现在是从左往右找小于等于pivot的元素,因为降序要求左边都是大于pivot的)第二个
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
相关产品推荐
相关产品推荐

