Shell各种排序方式

本文介绍了四种基础排序算法:冒泡排序、插入排序、直接选择排序和反转排序。冒泡排序通过不断交换相邻元素实现升序排列;插入排序类似于玩扑克牌,逐步将元素插入已排序部分;直接选择排序每次找到最小值并置于序列开头;反转排序则是将数组元素按相反顺序排列。每种算法都有其独特的工作原理和适用场景,理解这些基础排序算法对于提升编程能力大有裨益。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

冒泡排序

 插入排序

直接选择排序

 反转排序


冒泡排序

冒泡排序,该排序的命名非常形象,即一个个将气泡冒出。冒泡排序一趟冒出一个最大(或最小)值。

#!/bin/bash
#冒泡排序,升序

arr=(63 4 24 1 3 15)
echo "原始的数组列表顺序为: ${arr[@]} "
length=${#arr[@]}
#使用外部循环定义比较轮数,轮数为数组长度减1,且从1开始
for ((a=1;a<length;a++))
do 
   #使用内部循环比较相邻元素,确定元素位置,较大数放后面,且每轮比较次数会随着轮数递减
   #这里内部循环的变量用来表示两个相邻比较元素的前一个元素的下标
   for ((b=0;b<length-a;b++))
   do 
      #定义left变量获取两个相邻比较元素的前一个比较元素的值
      left=${arr[$b]} 
      #定义left变量获取两个相邻比较元素的后一个比较元素的值
      c=$[b+1]
      right=${arr[c]}
         #两个相邻元素的值比较,如果前一个元素的值较大则两个元素互换值
      if [ $left -gt $right ];then
         tmp=$left
         arr[$b]=$right
         arr[$c]=$tmp
      fi      
   done
   
done
echo "排序后的数组顺序为: ${arr[@]}"

1

 2.

 插入排序

插入排序,又叫直接插入排序。实际中,我们玩扑克牌的时候,就用了插入排序的思想。

基本思想:

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

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

 

#!/bin/bash
#插入排序,实现升序
arr=(63 4 24 1 5 3)
length=${#arr[@]}
#定义比较轮数,并且a的值用于作为待排序的元素下标
for ((a=1;a<length;a++))
do
    #定义用于和待排序的元素比较的元素下标范围
    #拿待排序的元素和前面已排序好的元素进行比较,较大的数放后面的待排序元素的位置,较小的放前面
    for((b=0;b<a;b++))
    do
        if [ ${arr[$a]} -lt ${arr[$b]} ];then
             tmp=${arr[$a]}
             arr[$a]=${arr[$b]}
             arr[$b]=$tmp
        fi
    done
done

echo "排序后数组顺序: ${arr[@]}"
 

 

直接选择排序

选择排序,即每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。

代码:

//选择排序(一次选一个数)voidSelectSort(int*a,intn){inti=0;for(i=0;i

时间复杂度:O(N2)O(N^2)O(N2)空间复杂度:O(1)O(1)O(1)

实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。

#直接选择排序,实现升序

arr=(63 4 24 1 3 15)
length=${#arr[@]}
#外部循环定义循环轮数为数组长度减1
for ((a=1;a<length;a++))
do
  #初始定义下标为0的元素的值最大    
  n=0
  #定义内循环变量为从第二个元素下标开始,用于比较当前假设的最大元素的值,并记录最大元素的下标
  for ((b=1;b<=length-a;b++))
  do
      if [ ${arr[$b]} -gt ${arr[$n]} ];then
         n=$b
      fi
  done
  #获取每轮最后一个比较元素的下标
  last=$[length - a]
  #拿最大的元素的值和当前轮数的最后一个比较元素交换值
  tmp=${arr[$last]}
  arr[$last]=${arr[$n]}
  arr[$n]=$tmp
done

echo "排序后的数组顺序为: ${arr[@]}"

 反转排序

#!/bin/bash
#反转排序
arr=(10 20 30 40 50 60 70 80)
length=${#arr[@]}
#设置前后两个替换元素中的前面的元素下标的取值范围,从0开始
for ((a=0;a<length/2;a++))
do
   tmp=${arr[$a]}
   arr[$a]=${arr[$length-1-$a]}
   arr[$length-1-$a]=$tmp
done

echo "反转排序后的数组顺序为: ${arr[@]}"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值