排序算法中的降序子序列排序问题:结果与预期不符排查
问题排查与修复:批量排序所有降序子序列
原代码核心问题
你的代码逻辑存在根本性偏差:
- 每次仅识别并排序最长的降序子序列,而非遍历数组找出所有符合要求的降序子序列
- 递归调用的方式只会重复处理最长子序列,导致其他短降序段被错误跳过或处理顺序混乱
- 从输出结果看,
[76,58,3]这段被拆分成了错误的分段,就是因为第一次处理了更长的段,后续递归时数组结构变化导致识别逻辑出错
修复思路
我们需要遍历数组,逐个识别每一段连续的降序子序列(定义:连续两个元素满足x[i] < x[i-1]则属于当前降序段):
- 记录每个降序段的起始索引
- 当遇到升序元素(
x[i] > x[i-1])时,若当前降序段长度≥2,立即对该段进行升序排序 - 遍历结束后,检查最后一段是否为降序段,若满足条件则排序
修正后的代码
import java.util.Arrays; public class DescendingSubsequenceSorter { public static void sortAllDescendingSubsequences(int[] x) { if (x == null || x.length <= 1) { return; } int segmentStart = 0; // 记录当前降序段的起始索引 for (int i = 1; i < x.length; i++) { if (x[i] > x[i-1]) { // 遇到升序边界,检查之前的段是否是有效降序段(长度≥2) if (i - segmentStart >= 2) { sortSubArray(x, segmentStart, i-1); } // 重置降序段起始为当前索引 segmentStart = i; } } // 处理数组末尾的最后一段降序子序列 if (x.length - segmentStart >= 2) { sortSubArray(x, segmentStart, x.length - 1); } } // 辅助方法:对数组指定区间进行升序排序 private static void sortSubArray(int[] x, int start, int end) { Arrays.sort(x, start, end + 1); } public static void main(String[] args) { int[] arr = {53, 50, 41, 8, 64, 35, 17, 76, 58, 3, 75, 1, 99, 56, 2}; sortAllDescendingSubsequences(arr); System.out.println(Arrays.toString(arr)); } }
代码说明
- 去掉了不必要的递归和最长子序列追踪逻辑,改为一次遍历处理所有符合条件的段
- 每次遇到升序边界时立即处理前面的降序段,保证所有长度≥2的降序子序列都被排序
- 最后单独处理末尾的降序段,避免遗漏
- 辅助方法
sortSubArray直接利用Arrays.sort的区间排序功能,简洁高效
验证结果
运行修正后的代码,输入数组会被处理为预期结果:[8, 41, 50, 53, 17, 35, 64, 3, 58, 76, 1, 75, 2, 56, 99]
内容的提问来源于stack exchange,提问作者Poppele
相关产品推荐
相关产品推荐

