当前位置: 首页 > news >正文

shell排序算法

目录

一、冒泡排序

 二 、直接选择排序

 三、反转排序

四、插入排序


一、冒泡排序

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

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

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

#!/bin/bash
array=(60 20 30 50 10 40)
echo "原数组参数顺序为:${array[*]}"
for ((i=1;i<${#array[*]};i++))
do
    for ((a=0;a<${#array[*]}-i;a++))
    do
      if [ ${array[$a]} -gt ${array[$a+1]} ]
      then
        temp=${array[$a]}
        array[$a]=${array[$a+1]}
        array[$a+1]=$temp
      fi
    done
done
    echo "经过冒泡排序后,数组顺序为:${array[*]}"

 

 二 、直接选择排序

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

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

        算法思路:index记录最大元素的下标,啊记录当前轮数的最后一个比较元素的下标。外循环控制比较轮数,内循环用于指定当前轮数的最后一个比较轮数(找最大的元素下标的范围)

#!/bin/bash
arr=(63 4 24 1 3 15)
echo "老数组的顺序为:${arr[@]}"
length=${#arr[@]}

#定义比较的轮数,还是数组长度减1
for ((a=1; a<length; a++ ))
do
  #定义当前比较轮中拥有最大值的元素下标的初始值为0
  index=0
  #定义当前比较轮的除了第一个元素的其他比较元素的下标的范围,会随着比较轮数的增加而减少,从1开始
  for ((b=1; b<=length-a; b++ ))
  do
    #获取其他比较元素的值
    OTHER=${arr[$b]}
    #获取当前比较轮中最大元素的值
    MAX=${arr[$index]}
    #通过拿其他比较元素的值与最大元素的值比较,获取当前比较轮的最大元素的下标
    if [ $OTHER -gt $MAX ];then
      index=$b
    fi
  done

#拿当前比较轮的最大元素的值与当前比较轮最后一个元素的值进行交换
  #获取当前比较轮的最后一个元素的下标
  last=$[$length - $a]
  #使用临时变量temp,获取当前最后一个元素的值
  temp=${arr[$last]}
  #把当前轮最大的元素的值赋给最后一个元素
  arr[$last]=${arr[$index]}
  #把原来最后一个元素的值赋给原最大的元素
  arr[$index]=$temp

done

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

[root@localhost ~]# bash test1.sh
老数组的顺序为:63 4 24 1 3 15
排序后的宿主顺序为:1 3 4 15 24 63 

 

 三、反转排序

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

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

#!/bin/bash

arr=(10 20 30 40 50 60)
echo "排序前的数组顺序为:${arr[@]}"
length=${#arr[@]}
#拿折半的前几个数作为参照物
for ((a=0; a<length/2; a++))
do
  #获取折半前面的数值
  front=${arr[$a]}
  #获取折半后面的数值
  backend=${arr[$length-1-$a]}
  #前后值进行交换
  temp=$front
  arr[$a]=$backend
  arr[$length-1-$a]=$temp
done

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

四、插入排序

  • 插入排序,又叫直接插入排序。实际中,我们玩扑克牌的时候,就用了插入排序的思想
  • 基本思想 : 在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。

 

#!/bin/bash
arr=(63 4 24 1 3 15)
echo "排序前的数组顺序为:${arr[@]}"
length=${#arr[@]}

#定义需要排序的元素范围,从第二个元素开始与第一个元素比较
for ((a=1; a<length; a++))
do
  #用于定义已经排序好的元素范围
  for ((b=0; b<a; b++))
  do
    WAITER=${arr[$a]}
    FINISH=${arr[$b]}
    #升序排序,所以如果待排序的元素值下于前面已经排序好的元素的值,则进行交换,小的往前放,大的往后放
    if [ $WAITER -lt $FINISH ];then
      temp=$WAITER
      arr[$a]=$FINISH
      arr[$b]=$temp
    fi
  done
done

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

相关文章:

  • Hadoop - 本地安装 完全分布式安装 集群配置 xsync分发脚本
  • 基于视觉AI的管道高后果区预警系统
  • 计算机毕业设计ssm+vue基本微信小程序的蛋糕预订平台系统
  • CSP202206-1 归一化处理 (C/C++)
  • c++ 11 多线程支持 (std::packaged_task)
  • Spring MVC注解Controller源码流程解析--定位HandlerMethod
  • 常用排序方法、sort的实现原理、快排的优化
  • centos7 离线安装httpd
  • Redis学习之路(三)--key键操作
  • 为什么这么多品牌迫切想要改变Logo?
  • 郁锦香、凯里亚德亮相“2022锦江行”,如何走出一条酒店破题之路
  • 拓展:Microsoft密钥类型说明
  • 基本 nosql 和 mongodb等数据库对比基本 nosql 和 mongodb等数据库对比
  • 使用打表法找规律
  • dockerkubernets篇(二十八)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 0基础学习移动端适配
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • HTTP中的ETag在移动客户端的应用
  • JAVA多线程机制解析-volatilesynchronized
  • jquery ajax学习笔记
  • MySQL用户中的%到底包不包括localhost?
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 程序员最讨厌的9句话,你可有补充?
  • 如何设计一个微型分布式架构?
  • 十年未变!安全,谁之责?(下)
  • 小试R空间处理新库sf
  • gunicorn工作原理
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​configparser --- 配置文件解析器​
  • #QT(串口助手-界面)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (ZT)出版业改革:该死的死,该生的生
  • (第一天)包装对象、作用域、创建对象
  • (二)Linux——Linux常用指令
  • (六)c52学习之旅-独立按键
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (算法)Game
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (正则)提取页面里的img标签
  • (转)可以带来幸福的一本书
  • (转)平衡树
  • .“空心村”成因分析及解决对策122344
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net 反编译_.net反编译的相关问题
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net7 环境安装配置
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @RequestMapping 的作用是什么?