【数组排序算法】

news/2024/11/24 13:48:14/

目录

  • 一、数组排序算法
    • 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=$firstarr[$b]=$secondarr[$c]=$tmpfidone
doneecho "冒泡排序后的数组的值为: ${arr[@]}"
}##### main #####
read -p "请输入一组列表: " numarray=$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]} ]theni=$bfi
done#获取当前轮数的最后一个元素的下标last=$[length - a]#先用临时变量获取当前轮数的最后一个元素的值tmp=${arr[$last]}#将最大元素的值赋给当前轮数的最后一个元素arr[$last]=${arr[$i]}#将临时变量的值,即原最后一个元素的值作交换arr[$i]=$tmpdone
echo "排序后的数组的值为: ${arr[@]}"
}##### main #####
read -p "请输入一组列表: " num
array=$numecho "排序前的数组值为: ${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]} ]thentmp=${arr[$a]}arr[$a]=${arr[$b]}arr[$b]=$tmpfidone
doneecho "排序后数组的值为: ${arr[@]}"
}##### main #####
read -p "请输入一组列表: " num
array=$numecho "排序前的数组值为: ${array[@]}"CHARU ${array[@]}

四、反向序列算法

1.1、反向序列算法的脚本编写

#!/bin/basharr=(1 2 3 4 5 6 7 8 9)
echo "排序前数组的值为: ${arr[@]}"length=${#arr[@]}for ((a=0; a<length/2; a++))
dotmp=${arr[$a]}#获取当前轮数的最后一个元素下标,会随着轮数的增加而减少last=$[length-1-a]arr[$a]=${arr[$last]}arr[$last]=$tmpdoneecho "排序后数组的值为: ${arr[@]}"

http://www.ppmy.cn/news/63603.html

相关文章

Hive为什么要分桶?

1.获得更高的查询处理效率 在 分区数量过于庞大 以至于可能导致文件系统崩溃时&#xff0c;或数据集 找不到合理的分区字段 时&#xff0c;我们就 需要 使用分桶 来解决问题了。 分区中的数据可以被进一步拆分成桶 &#xff0c;不同于分区对列直接进行拆分&#xff0c;桶往往使…

深入了解Dubbo SPI 工作机制——@Adaptive(6)

Adaptive这个注解就是适配策略&#xff0c;我都是称呼为最佳适配子类&#xff0c;或者最佳适配类。就是找到最佳的子实现类的&#xff0c;其实就是默认的类。这个注解可以打在类上方&#xff0c;那么dubbo SPI机制通过接口获取实例类&#xff0c;就是获取到有Adaptive注解的实现…

【MySQL】SQL优化

记录Mysql学习笔记&#xff0c;大部分图片来自黑马程序员MySQL教程。 文章目录 插入数据insert优化load 主键优化order by优化group by优化limit优化count优化update优化总结 插入数据 insert优化 插入多条数据的时候&#xff0c;可以按以下方式优化。 批量插入时&#xff…

Redis 主从 + 哨兵模式搭建

前言&#xff1a;以Linux环境为示例 一、整体架构&#xff08;1主 2从 3哨兵&#xff09; 二、redis 安装 1、安装路径&#xff1a;/usr/local/redis/redis-6382&#xff08;可自行指定&#xff09; 2、解压安装包&#xff1a; 直接解压&#xff1a;tar -axvf redis-5.0.…

java 多线程问题汇总

Java 多线程编程是 Java 编程中的重要话题&#xff0c;有很多常见问题和技巧需要掌握。以下是一些常见的 Java 多线程问题汇总&#xff1a; 1. 什么是线程安全&#xff1f;为什么需要保证线程安全&#xff1f; 线程安全指的是当多个线程同时访问一个共享资源时&#xff0c;不…

Midjourney-Discord入门+高手指引手册

上一篇我们说了如何注册和订阅&#xff0c;今天我们来讲一讲相关的细节&#xff0c;首先我们来一个概览图&#xff0c;先有个大致的印象。 概览图 生成的四张图片&#xff0c;类似于Demo&#xff0c;从左至右&#xff0c;从上至下&#xff0c;1,2,3,4放大按钮U1&#xff0c;U2…

基于AT89C51单片机的电子计数器设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87770826 源码获取 主要内容&#xff1a; 设计一个电子计时器&#xff0c;数码管初始显示值为“00”&#xff0c;每隔1s电子秒表加1&#xff1b;秒计数到60时清0&a…

Android 9.0 禁止usb键盘和usb鼠标挂载

1.概述 在9.0的系统产品开发中,对于系统中usb鼠标和usb键盘的等外设输入设备挂载处理,系统是在inputflinger模块中处理的,在产品的需求中对于外设输入设备的usb鼠标和usb键盘的挂载是禁用的,所以需要从挂载入手,禁止挂载usb鼠标和usb键盘 2.禁止usb键盘和usb鼠标挂载的核…