随笔 - 55  文章 - 0  评论 - 0  阅读 - 1047

1_排序

一.排序

1.冒泡排序
#!/bin/bash
function maopao_paixu(){
    arr=($@)
    # 获取数组的长度
    len=${#arr[@]}
    #外层循环用来定义比较轮数,比较轮数为数组长度减1,且从1开始
    for ((i=1; i<len; i++)); do
    #内层循环用来确定比较元素的位置,比较相邻两个元素,较大的元素往后移,并且比较次数会随着比较轮数的增加而减少
        for ((j=0; j<len-i; j++)); do
            #获取相邻两个元素的前面元素的值
            first=${arr[$j]}
            #获取相邻两个元素的后面元素的值
            h=$[j + 1]
            second=${arr[$h]}
            #比较两个相邻元素的值大小,如果前面元素的值较大,则与后面元素交换位置
            if [ $first -gt $second ]; then
                #使用临时变量保存前面元素的值,实现两个相邻元素交换位置
                tmp=$first
                arr[$j]=$second
                arr[$h]=$tmp
            fi
        done
    done
    echo "冒泡排序后的数组的值为:" ${arr[@]}
}
read -p "请输入一组列表" num
array=($num)
echo "原数组为:" ${array[@]}
MAOPAO ${array[@]}
2.选择排序
#!/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
3.插入排序
#!/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[@]}"
4.反转排序
#!/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[@]}"
5.希尔排序
#!/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[*]}
posted on   鸟叔书  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示