在Bash中获取数组前N个最大值并保留原索引的实现方法
在Bash中获取数组前N个最大值及其原索引
我明白你现在的需求——要在Bash里拿到数组的前N个最大值,还要保留它们在原数组里的索引,而且不能直接排序打乱顺序对吧?你现在的代码只能找出单个最大值,确实没法迭代获取剩下的N-1个,我来给你捋捋怎么解决这个问题。
首先,你的现有代码逻辑是对单个最大值的查找,但要获取前N个,关键在于每次找到当前最大值后,把它标记为一个不会被再次选中的值,这样下一轮循环就能找到次大值,同时还要保留原索引的对应关系。
下面是实现这个需求的完整代码,以你给出的数组和N=4为例:
# 定义原数组 ar=(10 30 44 44 69 12 11) # 需要获取的前N个最大值的数量 N=4 # 复制原数组到临时数组,用于标记已选中的最大值,避免重复选取 temp_ar=("${ar[@]}") # 循环N次,每次找出当前剩余的最大值 for ((i=0; i<N; i++)); do # 初始化一个极小值作为当前最大值的初始值 max_val=-999999 max_idx=-1 # 遍历临时数组,寻找当前最大值及其原索引 for ((j=0; j<${#temp_ar[@]}; j++)); do if (( temp_ar[j] > max_val )); then max_val=${temp_ar[j]} max_idx=$j fi done # 输出当前找到的最大值和原索引 echo "value: $max_val, index: $max_idx" # 将已找到的最大值位置标记为极小值,确保下次不会被选中 temp_ar[$max_idx]=-999999 done
代码逻辑解释:
- 我们复制了一份原数组到
temp_ar,这样修改临时数组不会影响原数组的索引对应关系 - 每次循环都会遍历临时数组,找到当前的最大值和它的原索引
- 输出结果后,把临时数组中这个最大值的位置设为一个极小值(比如
-999999),这样下一轮循环就会跳过它,去寻找下一个最大值 - 这个方法完美保留了原数组的索引,而且能正确处理重复的最大值(比如你的数组里两个44都会被找到,并且对应各自的原索引)
运行这段代码后,你会得到和示例完全一致的输出:
value: 69, index: 4
value: 44, index: 3
value: 44, index: 2
value: 30, index: 1
内容的提问来源于stack exchange,提问作者user3472065
相关产品推荐
相关产品推荐

