Shell编程之排序

news2024/11/14 3:48:53

目录

一、冒泡排序

二、选择排序

三、插入排序

基本思想:

 四、反转排序

基本思想:

五、睡眠排序

六、希尔排序

基本思想:

举例


一、冒泡排序

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

#!/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]}
    #获取相邻两个元素的后面元素的值
    c=$[b + 1]
    second=${arr[$c]}
    #比较两个相邻元素的值大小,如果前面元素的值较大,则与后面元素交换位置
    if [ $first -lt $second ];then
      #使用临时变量保存前面元素的值,实现两个相邻元素交换位置
      tmp=$first
      arr[$b]=$second
      arr[$c]=$tmp
    fi
  done
done
 
echo "冒泡排序后的数组的值为:${arr[@]}"
 
}
 
#### main ####
read -p "请输入一组列表:" num
 
array=($num)
echo "旧数组的值为:${array[@]}"
 
MAOPAO ${array[@]}

二、选择排序

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

#!/bin/bash

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

#外层循环定义排序的轮数,为数组长度减1,且从1开始
for ((a=1; a<length; a++));do
  #每轮比较的初始最大元素的下标,从0开始,即第一个元素
  i=0
  #内层循环定义用于与当前最大元素作比较的元素下标范围,从1开始,且每轮比较的最后一个元素下标会随着轮数怎加而减少
  for ((b=1; b<=length-a; b++));do
    #通过比较,获取当前轮数中最大元素的下标
    if [ ${arr[$i])} -lt ${arr[$b]} ];then
      i=$b
    fi
  done
  #获取当前轮数的最后一个元素的下标
  last=$[length - a]
  #先用临时变量获取当前轮数的最后一个元素的值
  tmp=$(arr[$last])
  #将最大元素的值赋给当前轮数的最后一个元素
  arr[$last]=${arr[$i]}
  #将临时变量的值,即原最后一个元素的值交换
  arr[$i]=$tmp
done

三、插入排序

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

基本思想:

在待排序的元素中,假设前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
    #将待排序的元素和前面已经排序好的元素依次比较,较小的数会交换到已排好序的元素位置
    if [ ${arr[$a]} -lt ${arr[$b]} ];then
      tmp=${arr[$a]}
      arr[$a]=${arr[$b]}
      arr[$b]=$tmp
    fi
  done
done

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

 四、反转排序

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

基本思想:

把数组最后一个元素与第一个元素替换,例数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换

#!/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[@]}" 

五、睡眠排序

根据睡眠可以使输出按顺序排序

go () {
    sleep `echo $1*0.01 | bc`
    echo $1
}
a=(3 7 5 9 50 25 4 6 1 89)
echo "初始数组为【${a[@]}】"
for i in ${a[@]}; do
    go $i &
done
sleep 1

六、希尔排序

希尔排序,又称缩小增量法

基本思想:

1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…

2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成

answer:gap越大,数据挪动得越快;gap越小,数据挪动得越慢。前期让gap较大,可以让数据更快得移动到自己对应的位置附近,减少挪动次数

举例

#!/bin/bash
array=(7 6 8 3 1 5 2 4)
echo ${array[*]}
length=${#array[*]}

#把距离为gap的元素编为一个组,扫描所有组,每次循环减少增量
for ((gap=$length/2; gap>0; gap/=2))
do
    for ((i=gap; i<$length; i++))
    do

	  temp=${array[$i]}
	  #对距离为gap的元素组进行排序,每一轮比较拿当前轮次最后一个元素与组内其他元素比较,将数组大的往后放
	  for ((j=i-gap; j>=0&&temp<${array[$j]}; j-=gap))
	  do
        array[$j+$gap]=${array[$j]}
	  done
	  #和最左边较大的元素调换位置
      array[$j+$gap]=$temp	  

    done
done
echo ${array[*]}

 

 

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

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

相关文章

ChatDOC工具——使用ChatGPT高效阅读技术科研论文

ChatDOC是一款功能强大的人工智能阅读辅助工具&#xff0c;专为帮助用户快速理解论文内容而设计。使用ChatDOC&#xff0c;您可以通过上传PDF版论文文献&#xff0c;利用先进的ChatGPT技术&#xff0c;只需三个简单步骤&#xff0c;便可以高效地阅读论文&#xff0c;提高阅读效…

TypeScript初识

目录 介绍 定义 优点 类型声明 ts文件编译选项 自动编译 编译选项的各个属性 include compilerOptions 介绍 定义 TS&#xff08;TypeScript&#xff09;是一种由微软开发的编程语言&#xff0c;它是 JavaScript 的一个超集&#xff0c;提供了静态类型检查、类、接…

Linux系统编程——多线程[中]:互斥与同步

0.关注博主有更多知识 操作系统入门知识合集 目录 1.并发过程中的问题 2.互斥 2.1互斥锁 2.2如何看待互斥锁 2.3加锁和解锁的本质 2.4对锁做一个封装 2.5可重入函数与线程安全 2.6死锁 3.同步 3.1条件变量 1.并发过程中的问题 我们知道&#xff0c;同一个进程中的…

【SpringBoot】过滤器,监听器,拦截器介绍

文章目录 一、简介1、过滤器2、拦截器3、监听器 二、如何创建1、过滤器2、监听器3、拦截器 三、总结 一、简介 通过两幅图我们可以理解拦截器和过滤器的特点 1、过滤器 过滤器是在请求进入tomcat容器后&#xff0c;但请求进入servlet之前进行预处理的。请求结束返回也是&…

模拟IC与数字IC设计该怎么选?哪个岗位薪资高?

很多同学想要入行IC&#xff0c;但不知道数字和模拟方向怎么选&#xff1f; 如果没有亲身体会过模拟设计&#xff0c;并有发自内心的自信或者兴趣&#xff0c;一般不看好纯小白去学模拟电路设计。 模拟设计想做好&#xff0c;没有数学功底&#xff0c;没有电路分析的功底&…

面试题30天打卡-day24

1、Redis 为什么快&#xff1f; Redis 之所以快&#xff0c;主要是因为它具有以下特点&#xff1a; 纯内存操作&#xff1a;Redis 的数据存储在内存中&#xff0c;因此读写速度非常快&#xff0c;而无需像传统数据库一样从硬盘读取和写入数据。与此同时&#xff0c;Redis 支持…

【算法】动态规划算法求(编辑距离)

目录 编辑距离&#xff1a; 举例&#xff1a; 代码如下 调试&#xff1a; 核心代码&#xff1a; 画图演示上述代码&#xff1a; 编辑距离&#xff1a; 是一种计算两个自符串之间差异程度的方法&#xff0c;它通过比较两个字符串之间的插入&#xff0c;删除和 替换操作的数…

深度神经网络模型部署——Docker学习

容器技术中有三个核心概念&#xff1a;容器&#xff08;Container&#xff09;、镜像&#xff08;Image&#xff09;&#xff0c;以及镜像仓库&#xff08;Registry&#xff09; 从本质上来说&#xff0c;容器属于虚拟化技术的一种&#xff0c;和虚拟机&#xff08;Virtual Mac…

CentOS7安装vsftpd

CentOS7安装vsftpd 最近又用到ftp了&#xff0c;摸索了一下终于安装成功&#xff0c;记录下安装过程&#xff0c;本次使用的操作系统为 CentOS7&#xff0c;ftp使用vsftpd。 安装vsftpd yum install -y vsftpd配置vsftpd vsftpd的配置文件路径为&#xff1a;/etc/vsftpd/vs…

软件测试基础面试题大全(上)

1. 软件生命周期是什么&#xff1f; 软件生命周期&#xff1a;需求调研&#xff08;可行性研究&#xff09;、需求分析&#xff08;需求规格说明书&#xff09;、设计&#xff08;系统架构、模块设计、表结构设计、接口设计等&#xff0c;产出概要设计文档和详细设计文档&…

表达式求值问题-双栈模板化实现

好久不见&#xff0c;真的很久都没有更新博客了&#xff0c;最近很多事情&#xff0c;所以比较忙碌&#xff0c;没有时间每天都学算法&#xff0c;但是我会挤时间尽量做到&#xff0c;每两三天就更新博客&#xff0c;我会努力的&#xff0c;加油~ 前言&#xff1a;计算器都见过…

加码本地生活、成为“万能入口”,抖音完成了百度曾经的梦想

文|螳螂观察 作者| 小别 前有美团点评&#xff0c;后有阿里巴巴&#xff0c;本地生活服务从来就不平静。 并没有在最好的时间出发的抖音&#xff0c;还是顺着短视频的内容优势&#xff0c;从团购、本地游、外卖再到近期推出商城频道&#xff0c;逐步完善了本地生活服务的布局…

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件&#xff0c;使负载测试或业绩为导向的业务&#xff08;功能&#xff09;测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ&#xff08;现在称为如 Apache Tomca…

linux命令文本命令之~~~ sort ~~ tr ~~cut ~~ uniq

目录 一. sort命令二. uniq 命令三. tr命令四. cut命令 一. sort命令 以行为单位对文件内容进行排序&#xff0c;也将他根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码进行比较&#xff0c;最后按照升序输出排序 语法格式&#xff1a; sort 【选…

Web自动化测试:selenium的使用以及关于driver=webdriver.Firefox()无驱动报错问题

Selenium 1.什么是Selenium&#xff1f; Selenium是一个用于Web应用程序测试的工具。 主流的自动化测试工具有&#xff1a; web自动化测试&#xff1a;selenium、robot frameworkApp端自动化测试&#xff1a;Appium、Monkeyrunner、UIautomationPC客户端&#xff08;win32&…

打印机错误0x00000bc4,Win11系统找不到打印机怎么办

近期&#xff0c;又有不少小伙伴更新了Win11系统后&#xff0c;出现了打印机提示错误代码0x00000bc4&#xff0c;出现错误后&#xff0c;可能导致打印机无法正常工作&#xff0c;打印任务无法完成&#xff0c;或者打印机无法连接到电脑等问题。驱动人生就为大家带来打印机错误0…

使用docker部署wiki.js

安装docker这些就不讲了&#xff0c;教程一堆&#xff0c;相关的安装教程可以去官网看&#xff0c;只是没那么详细&#xff0c;尤其是有关数据库的配置&#xff1a;Docker 部署 Wiki.js pull wiki镜像&#xff1a; docker pull ghcr.io/requarks/wiki 如果是arm的机器&#xf…

Oracle存储过程~封神之作

简介 Oracle 存储过程是 Oracle 数据库中的一种数据处理对象&#xff0c;它可以在数据库中定义一组预定义的 SQL 语句&#xff0c;用于完成特定的数据库操作。存储过程可以被授权的用户调用&#xff0c;并且可以执行多个语句&#xff0c;这些语句可以被视为一个单独的操作&…

【逗老师的无线电】快速记录一下MMDVM串口屏相关

最近在研究MMDVM的串口屏&#xff0c;设计知识点比较多&#xff0c;本文先随手记一下&#xff0c;同时随时更新&#xff0c;最后形成完整的文档 一、Nextion和国内串口屏设计 MMDVM默认对接的是Nextion屏幕。但是有人跟我说&#xff0c;NXT的屏幕和国内陶晶驰的屏幕就是一个…

每周一算法:差分算法

差分算法 差分是一种常见的算法&#xff0c;用于快速修改数组中某一段区间的值。其基本思想就是预处理出数组的差分数组&#xff0c;然后修改区间时&#xff0c;只需要修改两个位置的值&#xff0c;即可快速完成区间修改。最后再通过差分数组求出原数组。差分算法在区间加、区…