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

如何在C++中自定义排序数组,保留指定区间元素不排序?

实现数组排序但保留指定区间元素不动的方案

这是个很实用的定制化排序需求,我来拆解下实现思路和具体代码:

核心思路

要实现「区间[n,m]内元素保持原位置,区间外元素统一排序后放回」,可以分成三步:

  1. 提取区间外元素:遍历数组,把所有索引不在[n,m]范围内的元素收集到临时集合里
  2. 排序临时集合:对收集到的区间外元素进行常规排序
  3. 回填元素:再次遍历原数组,遇到非区间位置时,从排序后的临时集合中按顺序取元素填充

代码示例

Python 实现

def sort_except_range(arr, n, m):
    # 提取所有不在[n,m]区间的元素
    excluded_elements = [arr[i] for i in range(len(arr)) if i < n or i > m]
    # 对区间外元素排序
    excluded_elements.sort()
    # 将排序后的元素回填到原数组的非区间位置
    fill_index = 0
    for i in range(len(arr)):
        if i < n or i > m:
            arr[i] = excluded_elements[fill_index]
            fill_index += 1
    return arr

# 测试题目中的示例
input_array = [10, 4, 11, 7, 6, 20]
n, m = 1, 3
# 使用copy避免修改原数组
result = sort_except_range(input_array.copy(), n, m)
print(result)  # 输出: [6, 4, 11, 7, 10, 20]

Java 实现

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CustomSort {
    public static int[] sortExceptRange(int[] arr, int n, int m) {
        // 收集区间外的元素
        List<Integer> excluded = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if (i < n || i > m) {
                excluded.add(arr[i]);
            }
        }
        // 排序区间外元素
        Collections.sort(excluded);
        // 回填到原数组
        int fillPos = 0;
        for (int i = 0; i < arr.length; i++) {
            if (i < n || i > m) {
                arr[i] = excluded.get(fillPos);
                fillPos++;
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] input = {10, 4, 11, 7, 6, 20};
        int n = 1, m = 3;
        int[] output = sortExceptRange(input.clone(), n, m);
        for (int num : output) {
            System.out.print(num + " ");
        }
        // 输出: 6 4 11 7 10 20
    }
}

注意事项

  • 参数合法性校验:实际使用时建议添加对n和m的校验,比如确保0 <= n <= m < 数组长度,避免索引越界
  • 原数组保护:示例中都使用了拷贝(copy()/clone())来避免修改原数组,如果不需要保留原数组,可以直接操作原数组以节省内存
  • 排序规则自定义:如果需要非默认排序(比如降序),只需要修改排序步骤的逻辑即可

内容的提问来源于stack exchange,提问作者Michael Pawn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:10:27