如何在Bash中同步排序两个关联数组 解决大数组排序异常问题
原有冒泡排序代码的问题
- 性能瓶颈:冒泡排序时间复杂度为O(n²),数组元素量大时耗时会指数级上升,本身就不适用于大数据量排序场景,这是大数组处理异常的核心原因。
- 数值比较逻辑错误:你在
[ ]结构中用<做比较,默认是按ASCII字符串比较,比如10 < 2会返回真(因为字符1的ASCII码比2小),数值排序逻辑直接出错,正确写法应该改用算术比较结构(( numArray[i] < numArray[i+1] ))。 - 无效传参:调用函数时你传入了两个数组的元素,但函数内部直接读取全局的
numArray和wordArray,传参完全无意义,不过该问题不影响排序逻辑,仅属于写法不规范。
更高效的同步排序方案
完全不需要自己实现排序算法,直接调用系统优化过的sort命令即可,性能远高于手写冒泡,大数组场景下也能稳定运行,实现逻辑如下:
# 按「次数 单词」格式拼接两个数组的对应元素,用sort按数值倒序排序 # sort参数:-n 按数值排序,-r 倒序(符合你从高频到低频的需求) sorted_pairs=$(paste <(printf "%s\n" "${numArray[@]}") <(printf "%s\n" "${wordArray[@]}") | sort -nr) # 拆分排序后的内容回两个数组 numArray=() wordArray=() while read -r count word; do numArray+=("$count") wordArray+=("$word") done <<< "$sorted_pairs"
针对你给出的示例输入numArray=(5 12 20 13)、wordArray=(because maybe why the),运行上述代码后,输出的两个数组和预期完全一致:numArray=(20 13 12 5)、wordArray=(why the maybe because)。
写入文本文件排序的实现方法
如果需要先落地成文件再排序,步骤如下:
- 把两个数组的对应元素逐行写入临时文件,每行格式为
次数 单词
paste <(printf "%s\n" "${numArray[@]}") <(printf "%s\n" "${wordArray[@]}") > temp.txt
- 用sort命令直接排序文件,输出到结果文件
sort -nr temp.txt > sorted.txt
- 如果需要把排序结果读回数组,直接逐行拆分结果文件即可
numArray=() wordArray=() while read -r count word; do numArray+=("$count") wordArray+=("$word") done < sorted.txt
你举例的输入文件内容1 Arthur、21 Zebra,用上述命令排序后,输出结果就是21 Zebra在前、1 Arthur在后,符合需求。
内容的提问来源于stack exchange,提问作者Simos Neopoulos
相关产品推荐
相关产品推荐

