无数组支持下,如何在Bourne Shell中实现冒泡排序?
Bourne Shell 无数组实现冒泡排序方案
核心思路
因为Bourne Shell(sh)不支持数组,我们可以用空格分隔的字符串替代数组存储数字,再结合位置参数和基础命令实现冒泡排序:
- 用空格拼接输入的所有数字,形成一个字符串作为待排序列表
- 借助
set --命令将字符串转换成位置参数($1、$2...),方便逐个访问元素 - 冒泡排序逻辑:重复遍历元素,比较相邻两个数,前大后小则交换;直到某一轮遍历无交换发生,说明列表已完全有序
- 每次交换后重新拼接字符串,更新待排序列表
完整实现代码
#!/bin/sh # 获取待排序元素数量 echo "请输入待排序元素的数量:" read count # 逐个读取数字,构建空格分隔的字符串 nums="" for i in $(seq 1 $count); do echo "请输入第$i个数字:" read num nums="$nums $num" done # 移除字符串开头多余的空格 nums=$(echo "$nums" | sed 's/^ //') # 冒泡排序主循环 swapped=1 while [ $swapped -eq 1 ]; do swapped=0 # 将待排序字符串转为位置参数 set -- $nums new_nums="" # 遍历所有相邻元素对 for i in $(seq 1 $(( $# - 1 ))); do current=$1 next=$2 if [ $current -gt $next ]; then # 交换两个元素,标记本轮有交换 new_nums="$new_nums $next" swapped=1 else new_nums="$new_nums $current" fi # 左移位置参数,处理下一对元素 shift done # 把最后一个未处理的元素加入新列表 new_nums="$new_nums $1" # 移除开头空格,更新待排序列表 nums=$(echo "$new_nums" | sed 's/^ //') done # 输出排序结果 echo "升序排序后的结果:" echo "$nums"
关键细节说明
sed 's/^ //':解决初始拼接字符串时开头多一个空格的问题swapped变量:用来判断是否还需要继续排序,若某一轮无交换,说明列表已完全有序,直接退出循环shift命令:每次处理完一对元素后,将位置参数左移一位,让下一对元素成为新的$1和$2- 循环结束后手动加入
$1:避免最后一个元素被遗漏,因为遍历只处理到倒数第二个元素
内容的提问来源于stack exchange,提问作者Alienable4221
相关产品推荐
相关产品推荐

