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

排序算法中的降序子序列排序问题:结果与预期不符排查

问题排查与修复:批量排序所有降序子序列

原代码核心问题

你的代码逻辑存在根本性偏差:

  • 每次仅识别并排序最长的降序子序列,而非遍历数组找出所有符合要求的降序子序列
  • 递归调用的方式只会重复处理最长子序列,导致其他短降序段被错误跳过或处理顺序混乱
  • 从输出结果看,[76,58,3]这段被拆分成了错误的分段,就是因为第一次处理了更长的段,后续递归时数组结构变化导致识别逻辑出错

修复思路

我们需要遍历数组,逐个识别每一段连续的降序子序列(定义:连续两个元素满足x[i] < x[i-1]则属于当前降序段):

  1. 记录每个降序段的起始索引
  2. 当遇到升序元素(x[i] > x[i-1])时,若当前降序段长度≥2,立即对该段进行升序排序
  3. 遍历结束后,检查最后一段是否为降序段,若满足条件则排序

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:17:17