shell数组排序方法

直接排序

#!/bin/bash
app=(55 66 16 9 8 20)
echo "排序前的数组的值为:${app[@]}"
length=${#app[@]}
#外层循环决定排序轮数,为数组长度减1,且从1开始
for ((a=1;a<length;a++))
do
#每轮比较初始最大元素的下标,从0开始,即第一个元素
i=0
#内层循环定义于和当前最大元素比较的元素下标范围,且每轮比较的最后一个元素下标会随着轮数增加而减少
    for ((b=1;b<=length-a;b++))
    do
    #通过比较,获取当前轮数中最大元素的下标    
     if [ ${app[$i]} -lt ${app[$b]} ];then
         i=$b
     fi
    done
    #获取当前轮数的最后一个元素的下标
     last=$[length -a]
    #用临时变量获取当前轮数的最后一个元素的值
     tmp=${app[$last]}
     #将最大元素的值赋给当前轮数的最后一个元素
      app[$last]=${app[$i]}
     #将临时变量的值,和最后一个元素的值交换
      app[$i]=$tmp
done
echo "排序后的数组的值为:${app[@]}"

 

 

直接插入排序

 

基本思想:

在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。

但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。

算法步骤

将第一待排序序列第一个元素看做一个有序序列把第二个元素到最后一个元素当成是未排序序列。

从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

 

#!/bin/bash
arr=(5 2 4 6 1 3)
echo "输出排序前数组:${arr[@]}"
length=${#arr[@]}

#外层循环定义待排序的元素下标位置
for ((a=1;a<length;a++))
do
#内层循环定义已经排好序的元素下标位置范围
   for ((b=0;b<a;b++))
   do
#将待排序的元素和前面已经排序好的元素依次比较,较小的元素会交换到已排好序的元素位置,较大的元素会放到待排序的元素位置
      if [ ${arr[$b]} -gt ${arr[$a]} ]
      then
        tmp=${arr[$a]}
        arr[$a]=${arr[$b]}
        arr[$b]=$tmp
       fi
   done
done
echo "输出排序好的数组:${arr[@]}"

 

 反转排序

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

基本思想:把数组倒数一个元素与第一个元素替换,倒数第二个和第二个元素替换,以此类推,直到把所有数组元素反转替换

#!/bin/bash
zzb=(1 2 3 4 5 6 7 8 9)
echo "排序前数组值为:${zzb[@]}"
length=${#zzb[@]}

for ((a=0;a<length/2;a++))
do
    tmp=${zzb[$a]}
#获取当前轮数的最后一个元素下标,会随着轮数增加而减少
    last=$[length-1-a]
    zzb[$a]=${zzb[$last]}
    zzb[$last]=$tmp
done

echo "排序后数组值为:${zzb[@]}"

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值