shell脚本之——数组排序算法(冒泡排序、直接选择排序、反转排序)

一、冒泡排序

1.概述:

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断向前移动

2.基本思想:

冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一 样从底部上升到顶部

3、算法思路:

冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换数随排序轮数而减少

4、格式

#!/bin/bash
#冒泡排序法(升序)

arr=(20 10 30 60 40 50)
echo "原始数组的顺序为:${arr[@]}"
#获取数组的长度
length=${#arr[@]}

#外层循环定义比较的轮数,轮数为数组长度减去1,从1开始
for ((a=1; a<$length; a++))
do
   #确定比较相邻两个元素的位置,较大往后放,并且每轮比较的最后一个元素下标要递减
   #这里使用变量b代表左边比较元素的下标范围
   for ((b=0; b<$length-a; b++))
   do
     #定义左边比较的元素的值
     left=${arr[$b]}
     #定义右边比较的元素的值
     c=$[$b + 1]
     right=${arr[$c]}
     #如果左边的元素比右边的元素的值大就互换元素的位置
     if [[ $left -gt $right ]]                    #如果想降序排列,只需将-gt 改为 -lt
     then
        #把左边的值保存到临时变量temp中
         temp=$left
        #把右边元素的值赋给左边的元素
         arr[$b]=$right
         arr[$c]=$temp
    fi
   done
done  

5、实例操作

 

 二、直接选择排序

1.概述:

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些

2.基本思想:

将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一 个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式

3、格式

#!/bin/bash
#直接选择排序(升序)

arr=(50 30 10 20 60 40)
echo "原始数组的顺序为:${arr[*]}"
length=${#arr[@]}
#定义排序轮数
for ((i=1; i<$length; i++))
do
   #先假设下标为0的元素值最大
   index=0
   #通过比较获取拥有最大值的下标(索引)
   for ((j=1; j<=$length-i; j++))
   do
   right=${arr[$j]}
   left=${arr[$index]}
   if [ $right -gt $left ];then
        index=$j
   fi
   done
   #把最大元素的值跟当前轮次最后一个元素交换
    last=$[$length -$i]
    temp=${arr[$last]}
    arr[$last]=${arr[$index]}
    arr[$index]=$temp
done
    echo "排序后的数组顺序为:${arr[*]}"  

4、输出结果

 

三、反转排序

1、概述:

以相反的顺序把原有数组的内容重新排序

2、基本思想:

把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换

3、格式

#!/bin/bash
#反转排序
arr=(60 50 40 30 20 10)
echo "原始数组的顺序为: ${arr[@]}"
#取数组的长度
length=${#arr[@]}
#使用for循环,次数为长度的一半
for ((a=0; a<$length/2; a++))
do
    #每次反转的时候定义一个临时变量
    temp=${arr[$a]}
    #将最后一个变量赋给第一个变量
    arr[$a]=${arr[$length-1-$a]}
    #将临时变量赋给最后一个变量
    arr[$length-1-$a]=$temp
done
    echo "反转排序后的数组顺序为:${arr[@]}"

4、输出结果

  

posted on 2021-07-24 00:35  笑洋仟  阅读(262)  评论(0编辑  收藏  举报

levels of contents