Linux shell编程 数组排序算法

news2024/11/27 17:51:20

 冒泡排序

循环对比相邻的元素,交换较大元素到后面的位置

  • 大循环根据列表中存在的元素数量循环n-1次,保证所有元素都能被排序完成
    • 小循环从前向后遍历,循环一次循环范围减少一位(由于后面的已经排列完成无需再比较)
    • 小循环每次循环向后移一位并进行比较,当遇到比自己小的数交换位置,保证每轮都能获取到最大的数排列到队尾

#!/bin/bash
MAOPAO() {
arr=($@)
#获取数组的长度
length=${#arr[@]}

#外层循环用来定义比较轮数,比较轮数为数组长度减1,且从1开始
for ((a=1; a<length; a++))
do
    #内层循环用来确定比较元素的位置,较比相邻两个元素,较大的元素往后移,并且比较次数会随着比较轮数的增加而减少
    for ((b=0; b<length-a; b++))
    do
        #获取相邻两个元素的前面元素的值
        first=${arr[$b]}
        #获取相邻两个元素的后面元素的值
        second=${arr[$b+1]}
        #比较两个相邻元素的值大小,如果前面元素的值较大,则与后面元素交换位置
        if [ $first -gt $second ];then
            #使用临时变量保存前面元素的值,实现两个相邻元素交换位置
            tmp=$first
            arr[$b]=$second
            arr[$b+1]=$tmp
            fi
    done
done

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

##### main #####
read -p "请输入一组列表:" num
array=($num)
echo "旧数组的值为: ${array[@]}"

MAOPAO ${array[@]}
[xue@xue ~]$ sh maopao.sh
请输入一组列表:10 5 9 41 62 4 2 84 6 42 66
旧数组的值为: 10 5 9 41 62 4 2 84 6 42 66
冒泡排序后的数组的值为: 2 4 5 6 9 10 41 42 62 66 84

直接选择排序

与冒泡排序对比,直接选择排序的交换次数更少,速度更快

每轮选择一个最大的元素交换至队尾排列完成的数字之前   

        或是   

每轮选取一个最小的元素交换至队首排列完成的数字之后

  • 大循环根据列表中存在的元素数量循环n-1次,保证所有元素都能被排序完成
    • 小循环从前向后遍历,循环一次循环范围减少一位(由于后面的已经排列完成无需再比较)
    • 小循环遍历数组,初始最大元素变量下标为0,当遇到的数字比当前变量数字大时更新变量(保证变量中一直为最大值下标),当循环到范围结束(未被排序完成的数字最后一位)根据最大元素变量下标该轮选取的最大元素未被排序的最后一位交换

 

 

#!/bin/bash
XUANZHE(){
arr=($@)

#获取数组的长度
length=${#arr[@]}

#定义外层循环的轮数,为数组长度减1,且从1开始
for ((a=1;a<$length;a++))
do
    #初始最大元素下标
    index=0

    #内层循环定义未被排序完成需要排序的元素范围
    #每轮循环后由于排序完成一位,下标范围-1
    for ((b=1;b<=$length-$a;b++)) #第二个到最后一个元素
    do
        #通过比较,获取当前轮数中最大元素的下标
        if [ ${arr[$index]} -lt ${arr[$b]} ]
        then
            index=$b
        fi
    done

    #本轮选取的最大元素本轮 交换 本轮未被排序完成的最后一位
    last=$[length - a] #(最后一个元素下标每轮向前)
    tmp=${arr[$last]}
    arr[$last]=${arr[$index]}
    arr[$index]=$tmp
done
echo "排序后的数组的值为: ${arr[@]}"
}


##### main #####
read -p "请输入一组列表: " num
array=$num

echo "排序前的数组值为: ${array[@]}"

XUANZHE ${array[@]}
[xue@xue ~]$ sh xuanze.sh
请输入一组列表: 10 5 9 41 62 4 2 84 6 42 66
排序前的数组值为: 10 5 9 41 62 4 2 84 6 42 66
排序后的数组的值为: 2 4 5 6 9 10 41 42 62 66 84

直接插入排序

依次选择未被排序的元素,与已排序元素对比

若比当前对比的已排序元素小,插入到该元素之前,保证已排序元素有序排序

 

#!/bin/bash
CHARU(){
arr=($@)

#获取数组的长度
length=${#arr[@]}
#外层循环定义待排序的元素下标位置 
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[@]}"
}

##### main #####
read -p "请输入一组列表: " num
array=$num

echo "排序前的数组值为: ${array[@]}"

CHARU ${array[@]}

反向排序

数组为 1 2 3 4 5 6 7 8 9 0 

过程大致为

10交换 29交换 38交换 47交换 56交换

#!/bin/bash

arr=(1 2 3 4 5 6 7 8 9)
echo "排序前数组的值为: ${arr[@]}"

length=${#arr[@]}

for ((a=0; a<length/2; a++))
do
   tmp=${arr[$a]}

   #获取当前轮数的最后一个元素下标,会随着轮数的增加而减少
   last=$[length-1-a]
   arr[$a]=${arr[$last]}
   arr[$last]=$tmp

done

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【halcon知识】应用仿射变换

一、说明 无论什么样的变换&#xff0c;都离不开齐次变换矩阵。一般地&#xff0c;先准备一个空的齐次变换矩阵&#xff0c;这个矩阵随便填写&#xff1a;1&#xff09;填入旋转类参数就是旋转矩阵&#xff0c;2——填入仿射参数就可进行仿射变换&#xff0c;3&#xff09;填入…

Kali-linux攻击WordPress和其他应用程序

今天越来越多的企业利用SAAS&#xff08;Software as a Service&#xff09;工具应用在他们的业务中。例如&#xff0c;他们经常使用WordPress作为他们网站的内容管理系统&#xff0c;或者在局域网中使用Drupal框架。从这些应用程序中找到漏洞&#xff0c;是非常有价值的。 为…

[JAVA数据结构]堆

目录 1.堆的概念 2.堆的创建 3.堆的插入与删除 3.1堆的插入 3.2堆的删除 1.堆的概念 如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;…

【Linux】远程桌面连接服务器报错:未启用对服务器的远程访问......

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 前述操作环境说明&#xff1a;远程报…

<数据结构>NO4.带头双向循环链表

文章目录 前言1. 头文件2. 函数实现1&#xff09;创建哨兵位节点2&#xff09;新增一个节点3&#xff09;打印链表4&#xff09;头插5&#xff09;尾插6&#xff09;头删7&#xff09;尾删8&#xff09;查找9&#xff09;pos前插入10&#xff09;删除pos处节点11&#xff09;销…

Redis 缓存穿透、缓存击穿与缓存雪崩

文章目录 1. 缓存穿透解决方法 2. 缓存击穿解决方法 3. 缓存雪崩解决方法 在 redis 的应用场景中&#xff0c;需要考虑缓存在某些场景下可能出现的问题&#xff1a; 缓存穿透 缓存击穿 缓存雪崩 以下缓存问题的讨论都是基于以下应用架构讨论的&#xff1a; 1. 缓存穿透 对应…

数据备份系列:Rsync 备份实战记录(二)

一、Rsync Cron 场景使用 在对数据备份要求实时性不高的情况下&#xff0c;可优先考虑该场景&#xff0c;选择一个合适的时间&#xff0c;对数据进行定时远程增量同步。 在《数据备份系列&#xff1a;Rsync 备份详解&#xff08;一&#xff09;》中我们已经对服务搭建以及远程…

DAD-DAS模型

DAD-DAS模型 文章目录 DAD-DAS模型[toc]1 产品服务:需求方程2 实际利率:费雪方程3 通货膨胀:菲利普斯方程4 预期通货膨胀&#xff1a;适应性预期5 货币政策规则&#xff1a;泰勒方程6 动态总供给-总需求方程&#xff08;DAS-DAD&#xff09;7 总供给冲击模拟 1 产品服务:需求方…

【JavaEE初阶】文件操作——IO

摄影分享~ 文章目录 文件文件路径&#xff08;Path&#xff09; 文件的类型Java中操作文件File概述 文件内容的读写——数据流字节流InputStream概述OutputStream 概述字符流FileInputStream 概述利用 Scanner 进行字符读取 实例练习 文件 文件&#xff1a;File这个概念&…

PostSQL内存管理之内存上下文

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 了解pg内存分配 详细信息 1.MemoryContex机制 内存上下文是pg相关的内存控制结构&#xff0c;树形结构组织下的内存上下文能在频繁的…

SNMPc软件的下载和安装教程,计算机网络管理,网络工程师

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

vue 改变数据后,数据变化页面不刷新

文章目录 导文文章重点方法一&#xff1a;使用this.$forceUpdate()强制刷新方法二&#xff1a;Vue.set(object, key, value)方法三&#xff1a;this.$nextTick方法四&#xff1a;$set方法 导文 在vue项目中&#xff0c;会遇到修改完数据&#xff0c;但是视图却没有更新的情况 v…

让开发者成为创新主体 | 阿里云云原生4月动态

作者&#xff1a;云原生内容小组 云原生月度动态 ✦ 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 &…

vue - 实现登录后用户无操作后自动退出登录功能,当用户鼠标不动、键盘不动、无窗口滚动时自动清除登录状态(可自定义删减条件,详细示例源码一键复制开箱即用)

需求 很多教程都是无效而且有bug。。很难用索性自己搞了最健壮的解决方案。 在vue项目中,实现自动检测用户没有【移动鼠标】【操作键盘】【窗口滚动】时,自动清除登录信息强制退出登录下线,支持自定义触发时间(比如无操作10分钟就执行),自定义条件(比如只监听用户鼠标是…

匿名对象以及临时空间

目录 大纲 1.何为匿名对象 2.产生匿名对象的四种情况&#xff1a; 1&#xff09;给初始化对象时 2&#xff09;以值的方式给函数传参&#xff1b; 3&#xff09;类型转换&#xff1b; 4&#xff09;函数返回时&#xff1b; 3.编译器优化 I.在同一行代码的优化 II.在函…

电脑关机很慢怎么办?这5个方法很有用!

案例&#xff1a;电脑关机很慢怎么办&#xff1f; 【我的电脑才买来不久&#xff0c;现在每次关机都很慢&#xff0c;有时甚至一直在转圈圈无法关机&#xff0c;怎么处理这种情况呢&#xff1f;】 如果使用电脑时间长了&#xff0c;我们可能会发现电脑的各项性能都会有所下降…

Vue3(5)插槽Slots

目录 一、插槽内容与出口 二、渲染作用域 三、默认内容 四、具名插槽 五、作用域插槽 六、具名作用域插槽 一、插槽内容与出口 在之前的博文中&#xff0c;我们已经了解到组件能够接收任意类型的JS值作为props&#xff0c;但组件要如何接收模板内容呢&#xff1f;在某些…

图片堆叠、多重聚焦的几种办法

当拍摄的物品较小&#xff0c;景深较深时&#xff0c;相机的焦点只能放在较近或者较远的一处&#xff0c;图片的整个画面就不能保证完全清晰&#xff0c;多重聚焦的原理其实就是拼合&#xff0c;在画幅的不同处拍摄聚焦图片&#xff0c;将各个聚焦的内容拼合在一起&#xff0c;…

杂记 2023.5.11

目录 come across(as).. 与异性对话经验和理论、策略 单词记忆 机器学习 come across(as).. 这个用法在口语里超级高频&#xff0c;表示「给人.印象&#xff0c;让人觉得..」&#xff0c;s后面可跟名词、形容词、 being形容词。 我们再来看几个例子&#xff1a; ◆He comes ac…

【Leetcode -455.分发饼干 -459.重复的字符串】

Leetcode Leetcode -455.分发饼干Leetcode - 459.重复的字符串 Leetcode -455.分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩…