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

无数组支持下,如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:54:11