shell脚本编程之冒泡排序脚本实现

​ 冒泡排序作为编程中最为基础的算法,对于计算机编程初学者而言是非常值得多研究和多多尝试编写的。对于编程而言,优劣的不是语言,而是实现功能的逻辑思维和突如其来的灵感。

​ 下面将给出使用shell实现冒泡排序的脚本,其中涉及的正则表达式需要细细理解。具体解释在下面的注释中有备注。

#!/bin/bash
#学习shell脚本过程中实现循环输入数生成数组,然后使用冒泡排序法进行从小到大排序
#Author:lokott
#Version: 3.1
#冒泡排序法的核心思想为:引入变量,两两比较,符合不动,反之互换
#脚本如下:
#等待用户输入
read -p "please input num of this array:" n
#下面是test语句判断输入的是否为数字,但是错误输出提示不友好,所以换为if
#[[ $n =~ ^[0-9]+$ ]]&&echo "welcome"||exit 1
if [[ $n =~ ^[0-9]+$ ]]
then
    echo "welcome"
else
    echo "sorry you input no a number!"
    exit 1
fi
#循环n次,等待用户输入数字,打印显示出数组内容
for i in `seq $n`
do
    read -p "please input your num:" num
    if [[ $num =~ ^[0-9]+$ ]];then :
    else
        echo "sorry you input no a number!"
        exit 1
    fi
    let i=i-1
array[$i]=$num
done
echo "原顺序的数组:"
echo ${array[*]}
#冒泡排序算法,核心在于下面的if语句,其实并不难理解,如果小时候玩过汉诺塔就非常好理解
#举一个简单的例子:如果你想将两杯不同果汁互换,就需要一个空杯子来作为中间人,这就类似于下面的temp变量
#该脚本实现的是从小到大排序,因此if判断的时候使用的是-gt;而且该脚本需要双重循环
#双重循环口诀:内层循环执行一遍,外层循环执行一次;结合下面的j和k,就是j=0开始执行,而一直等到k为n时才到j=2,以此类推。
#内层循环控制单次比较:即先比较第一个数与后面的所有的数进行比较,遇到比之小的与之替换,继续执行if(这里参与比较的变量就发生改变了)
for ((j=0;j<$n;j++))
do
    for((k=j+1;k<$n;k++))
    do
        if [[ ${array[$j]} -gt ${array[$k]} ]]
        then
            temp=${array[$j]}
            array[$j]=${array[$k]}
            array[$k]=$temp
        fi
    done
done
echo "进行排序之后的数组:"
echo ${array[*]}

# 下面是执行冒泡排序脚本的结果:
# [root@localhost ~]# ./test.sh 
# please input num of this array:5
# welcome
# please input your num:1
# please input your num:2
# please input your num:5
# please input your num:6
# please input your num:4
# 原顺序的数组:
# 1 2 5 6 4
# 进行排序之后的数组:
# 1 2 4 5 6