Shell编程之数组排序算法(冒泡排序、直接选择排序、反转排序)

数组排序(使用tr、sort、for)

  1. 使用tr命令将数组内每个元素之间的空格替换为换行符;
  2. 之后使用sort命令按从小到大重新排序;
  3. 最后使用for循环遍历排序后的元素

    #!/bin/bash  ​  

arr=(63 4 24 1 3 15)  

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

#将每个元素之间的空格替换为换行符,然后重新排序  

list=$(echo ${arr[@]} | tr ' ' '\n' | sort -n)  ​

 a=0  

for i in $list  

do    

arr[$a]=$i    

let a++  

done  

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

冒泡排序的原理:
每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。

而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。
 

冒泡排序

 #!/bin/bash  ​  

arr=(63 4 24 1 3 15)  

echo "原数组顺序为:${arr[@]}"  

#获取数组的长度

 length=${#arr[@]}  ​

 #使用冒泡排序  #定义比较的轮数,比较轮数为数组长度减1,从1开始。

 for ((i=1;i<$length;i++))  

do

 #对比相邻元素,确定元素的位置,较大的值往右放,每轮的比较次数会随着比较轮数的增加而减少。

每轮比较次数=数组长度-轮数  

#变量以左边元素为参数    

 for ((j=0;j<$length-i;j++))      

do          

#定义左边元素的值          l

eft=${arr[$j]}        

 #定义右边元素的值        

 k=$[$j+1]        

 right=${arr[$k]}        

 #比较两边元素的值,如果左边的值大于右边的值,两个元素就互换          

if [ $left -gt $right ]        

 then            

 #使用临时变量temp保存左边元素的值              

tmp=$left              #将右边元素的值赋给左边元素            

arr[$j]=$right              #将原来的左边元素的值(保存在临时变量temp中)赋给右边元素             arr[$k]=$tmp      

fi    

 done

 done  

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

直接选择排序

void selectSort(int a[],int n){
    for(int i=1;i<=n-1;i++){//进行n-1趟选择
        int index=i;
        for(int j=i+1;j<=n;j++)//从无序区选取最小的记录
            if(a[index]>a[j])
                index=j;
        if(index!=i)
            swap(a[i],a[index]);
    }
}

反转排序

//反转排序
public class 反转排序 {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        int[] array = {10,20,30,40,50,60};
        反转排序 sorter = new 反转排序();
        sorter.sort(array);
    }
    public void sort(int[] array) {
        System.out.print("数组原有内容:");
        showArray(array);//输出原有数组
        int temp;
        int len =array.length;
        for(int i=0;i<len/2;i++) {
            temp=array[i];
            array[i]=array[len-1-i];
            array[len-1-i]=temp;
        }
        System.out.print("数组反转后内容:");
        showArray(array);
    }
    public void showArray(int[] array) {
        for(int i:array) {
            System.out.print("\t"+i);
        }
        System.out.print(" ");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值