【数组排序算法】

news2024/11/14 21:24:29

目录

  • 一、数组排序算法
    • 1、冒泡排序算法
      • 1.1、图形解释
      • 1.2、冒泡算法的脚本写法
  • 二、直接选择排序
    • 1.1、动态图解
    • 1.2、直接选择排序算法的脚本编写
  • 三、直接插入排序
    • 1.1、基本思想:
    • 1.2、动态图解
    • 1.3、直接插入排序的算法脚本编写
  • 四、反向序列算法
    • 1.1、反向序列算法的脚本编写


一、数组排序算法

1、冒泡排序算法

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

1.1、图形解释

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

1.2、冒泡算法的脚本写法

使用函数来进行对数组内部值的排序

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

实现了自动调整数组的排序
在这里插入图片描述

二、直接选择排序

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

解释:
假设第一个数字为最大的,让这个假设最大的数字与后面的数字挨个比较

请添加图片描述

1.1、动态图解

在这里插入图片描述

1.2、直接选择排序算法的脚本编写

使用函数来编写直接选择排序的脚本编写

#!/bin/bash
XUANZHE(){
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
echo "排序后的数组的值为: ${arr[@]}"
}


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

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

XUANZHE ${array[@]}

三、直接插入排序

1.1、基本思想:

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

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

1.2、动态图解

在这里插入图片描述
依次与元素比较,如果后面的值大于小于前面的值就向前面插入,依次比较
在这里插入图片描述

1.3、直接插入排序的算法脚本编写

#!/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.1、反向序列算法的脚本编写

#!/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/510317.html

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

相关文章

linux:文件替换的三种方式sed、awk、perl

文章目录 背景sed语法问题1、加个空字符串2、下载gnu-sed awk语法举例 perl语法示例 总结 背景 linux 文件内容替换&#xff0c;网上看了下大致就这三种 sed、awk、perl&#xff0c;今天挨个使用一下看看怎么样 sed 语法 Linux sed 命令是利用脚本来处理文本文件。详细文档…

网络基础认知(上)

如今使用过计算机的人们都接触过网络&#xff0c;但是网络究竟是什么&#xff0c;计算机又是怎样通过网络来进行互相之间通信的&#xff0c;这还需要我们深入了解。 目录 网络发展 初识协议 什么是协议 为什么需要协议&#xff1f; 网络协议初识 协议分层 为什么网络协议要…

澳鹏与Reka AI强强联合,构建高质量的多模态LLM应用

近日&#xff0c;澳鹏Appen官宣与AI新兴公司Reka AI合作&#xff0c;以实现世界级数据服务与多模态语言模型的结合。 ChatGPT等创新应用的崛起让大型语言模型&#xff08;LLM&#xff09;实现了突飞猛进的发展。LLM可以助力企业提升运营效率&#xff0c;并为最终用户提供耳目一…

Java基础--->JVM(3)【垃圾回收】

文章目录 垃圾回收&#xff08;GC&#xff09;什么内存需要回收&#xff08;什么样的对象是垃圾&#xff09;&#xff1f;为什么要进行垃圾回收&#xff1f;内存溢出和内存泄露的区别&#xff0c;如何解决分区收集思想 Minor GC、Major GC、Full GC垃圾回收相关算法引用计数算法…

如何搭建产品操作手册

对于企业来说&#xff0c;拥有一份完备的产品操作手册无疑是至关重要的。操作手册不仅是新员工学习产品使用及维护的重要参考&#xff0c;也是产品售后服务与客户支持的必备文件。在手册编写上&#xff0c;应清晰明了地介绍产品的功能、配置及故障排除等信息&#xff0c;使用户…

统计学下的假设检验

由于本人才疏学浅&#xff0c;再加上时间仓促&#xff0c;难免有疏漏之处&#xff0c;恳请批评指正. 1,预备知识 数理统计&#xff1a;以概率论为基础&#xff0c;研究如何有效的去搜集、整理、分析带随机性影响的数据 总体与样本&#xff1a;研究对象的全体就称为总体 样本&a…

VTK交互-vtkBoxWidget2

VTK交互Widget widget包含两个重要的组成部分&#xff1a;Interaction和Representation. Interaction是一些名叫vtk*Widget的类&#xff08;比如vtkBoxWidget2&#xff09;。它包含了交互的所有选项和事件处理。 Representation是显示并与之交互的一类对象&#xff0c;以名叫v…

origin 拟合计算酶的Kcat Km 值

origin拟合计算Kcat Km值 横坐标为底物浓度&#xff0c;纵坐标为反应速率 全选X 与Y坐标数据&#xff0c;然后选择菜单栏Analysis: Fitting: Nonlinear Curve Fit&#xff1a;Open Dialog 在Setting&#xff1a;Function Selection页面内的Category选择Pharmacology, Functi…

计算机网络基础知识(三)—— 什么是OSI七层模型?

文章目录 00 | &#x1f6f8;发展史&#x1f6f8;01 | &#x1f6f8;OSI七层参考模型&#x1f6f8;02 | &#x1f6f8;OSI七层参考模型的信息流向&#x1f6f8; OSI七层模型是Open Systems Interconnection Reference Model的缩写&#xff0c;是由国际标准化组织&#xff08;IS…

vue3使用keep-alive组件,包含动态组件使用

vue3使用keep-alive组件&#xff0c;包含动态组件使用 本文目录 vue3使用keep-alive组件&#xff0c;包含动态组件使用组件不使用keep-alive组件中使用v-if切换component动态组件切换因注释导致的意外错误动态组件的使用完整示例 路由不使用keep-alive路由中使用keep-alive生命…

公司数字化转型,如何选择高效的知识管理工具?

随着企业数字化转型的加速&#xff0c;知识管理工具的重要性也日益凸显。好的知识管理工具可以帮助企业提高工作效率、降低成本、提高创新能力和竞争力。但是&#xff0c;市场上的知识管理工具繁多&#xff0c;如何选择高效的知识管理工具成为了企业面临的一大难题。本文将从以…

Jenkins 入门系列之Role-based Strategy配置Gitlab Group管理用户组

目录 背景步骤1. 安装插件2. 配置Gitlab Group3. 配置 Jenkins 授权策略4. 配置 Jenkins 角色与授权5. 验证 背景 版本 Jenkins Version&#xff1a;Jenkins 2.403Gitlab Version: Gitlab 15.6部署环境&#xff1a;群晖NAS Docker 部署JenkinsGitlab 上一篇文章Jenkins 入门…

HTML详解

HTML是什么 html是一门语言&#xff0c;所有的网页都是用它编写出来的。 他是一门超文本标记语言。可以定义图片&#xff0c;音频&#xff0c;视频等。由标签组成。 HTMl仅仅定义了网站的接口。 具体的表现还需要css来实现&#xff0c;也就是css让网页变得更加好看。 网页…

智能聊天机器人ChatGPT商业版

作为一个智能聊天机器人&#xff0c;我是由OpenAI开发的。目前&#xff0c;我的商业版需要通过OpenAI的合作伙伴计划进行许可和部署&#xff0c;以确保我被用于适当的商业用途。如果您对商业使用感兴趣&#xff0c;请联系OpenAI以获取更多信息。 智能聊天机器人是一种能够自…

如何优化golang gc

目录 一.理解GO GC机制 1.1GC的耗时 1.2堆大小对GC的影响 1.3GC算法 二 如何查看GC信息 2.1使用GODEBUG"gotrace1" 2.2 go tool trace 2.3 debug.ReadGCStats ​编辑2.4 runtime.ReadMemStats 三 GC优化技巧 2.1并发GC 一.理解GO GC机制 GO语言采用的是三…

学习网络安全的拦路虎!你遇到几个?

很多零基础的同学想要学习网络安全&#xff0c;前期会各种寻找学习资料。最后发现资料一大堆&#xff0c;但无从下手&#xff0c;于是千辛万苦收集的资料就去收藏夹吃灰了。开始学习的小伙伴们通常也会越学越迷茫&#xff0c;毕竟资料并不是完整的&#xff0c;而是东拼西凑出来…

Docker时区问题

背景 当前docker容器技术应用越来越广泛&#xff0c;但在启动容器后&#xff0c;容器内部的时间并不是东八区 Docker的基础镜像设置大多是UTC&#xff0c;也就是标准的UTC 时间&#xff0c;所以要简单的调整一下&#xff0c;变成中国标准时间CST(China Standard Time UTC8:0…

OpenCL编程指南-1.2OpenCL图形API

OpenCL与图形 OpenCL的出现是对GPCPU编程的一个响应。人们用GPU处理图形&#xff0c;并且开始使用GPU完成工作中的非图形部分。基于这种趋势&#xff0c;异构计算&#xff08;已经存在很长时间&#xff09;与图形发生冲突&#xff0c;因此迫切需要一个行业标准。 OpenCL一直与…

使用Onenote进行钓鱼攻击事件分析

以其中遇到的一个案例为例子进行展开分析: 1、使用钓鱼邮件文案.one文件附件 From: Bank Complaints <bankcomplaintshkmagov.com> Sent: Thursday, March 2, 2023 11:00 AMTo: Miles Mok XXXXSubject: [External Mail] xxxx Industry Development Survey Dear XXXX Lt…

SpringBoot+Canal+RabbitMQ实战

1. Canal简介 https://github.com/alibaba/canal 1.1 Canal工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events&#xff0c;可以通过 show binlog events 进行查看)MySQL slave 将 master 的 b…