如何在C++中自定义排序数组,保留指定区间元素不排序?
实现数组排序但保留指定区间元素不动的方案
这是个很实用的定制化排序需求,我来拆解下实现思路和具体代码:
核心思路
要实现「区间[n,m]内元素保持原位置,区间外元素统一排序后放回」,可以分成三步:
- 提取区间外元素:遍历数组,把所有索引不在
[n,m]范围内的元素收集到临时集合里 - 排序临时集合:对收集到的区间外元素进行常规排序
- 回填元素:再次遍历原数组,遇到非区间位置时,从排序后的临时集合中按顺序取元素填充
代码示例
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
相关产品推荐
相关产品推荐

