数组排序算法

165 阅读2分钟

冒泡排序

原理

对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面,也就是交换两个元素的位置。

image.png

算法思路

冒泡算法由双层循环实现

  • 外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,且数组已经完成排序
  • 内部循环主要用于对比数组中每个相邻元素的大小,确定是否交换位置,对比和交换次数随排序轮数而减少

脚本内容

#!/bin/bash
#冒泡排序,升序
arr=(63 4 24 1 3 15)
echo "原始数组为:${arr[@]}"
length=${#arr[@]}
for ((a=1;a<length;a++))
do
        for ((b=1;b<=length-a;b++))
        do
                right=${arr[b]}
                c=$[$b - 1]
                left=${arr[$c]}
                if [ $left -gt $right ];then
                        arr[c]=$right
                        arr[b]=$left
                fi
        done
done
echo "排序后为:${arr[@]}"

解析

  1. 获取数组长度,外层循环决定轮数,轮数从1开始,比较轮数为数组长度减1 image.png

  2. 变量表示数组元素的下标,实现对两个相邻的元素相比较 image.png

  3. 用变量表示两个相邻的元素 image.png

  4. 比较两个相邻元素的值排序 image.png

运行效果

image.png

选择排序

原理

先假定第一个元素最大,用该数依次与后面数比较,如果比较到数比该数大,则后面由较大的数继续与后面数比较,直到比到最后一个数。如果最后一个数不是最大,那就将前面比较的数与最后一个数交换位置。以此类推,大的数不断排到后面,最后完成排序。

image.png

算法思路

选择排序算法由双层循环实现

  • 外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,且数组已经完成排序
  • 内部循环主要用于选出剩余未排序的数中最大的数,然后交换到后面的位置

脚本内容

#!/bin/bash
#选择排序
arr=(63 4 24 1 3 15)
l=${#arr[@]}
for ((a=1;a<l;a++))
do
        n=0
        for ((b=1;b<=l-a;b++))
        do
                if [ ${arr[b]} -gt ${arr[n]} ];then
                        n=$b
                fi
        done
        last=$[$l - $a]
        tmp=${arr[$last]}
        arr[$last]=${arr[$n]}
        arr[$n]=$tmp
done
echo "排序后为:${arr[@]}"

解析

  1. 获取数组长度,外层循环决定轮数,默认下标为0的数最大 image.png

  2. 定义内循环变量为从第二个元素下标开始,用于比较当前假设的最大元素的值,并记录最大元素的下标 image.png

  3. 获取每轮最后一个比较元素的下标,拿最大的元素和当前轮数的最后一个比较元素交换 image.png

运行效果

image.png

反转排序

原理

将一个按一定顺序排列(升序或降序)的数组,换个排序方式排列(升序变降序,降序变升序)。

算法思路

从外向内每对数交换值,直到全部交换过结束。如果总数是奇数个,那么中间的数不用管。

脚本内容

#!/bin/bash
#反转排序
arr=(10 20 30 40 50 60 70 80 90)
echo "原始数组:${arr[@]}"
l=${#arr[@]}
for ((a=0;a<l/2;a++))
do
        tmp=${arr[a]}
        arr[a]=${arr[$l-1-$a]}
        arr[$l-1-$a]=$tmp
done
echo "反转后:${arr[@]}"

解析

利用for循环,从外向内读取数,每对数交换值。 image.png

运行效果

image.png

插入排序

原理

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。
按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

image.png

算法思路

插入排序算法使用双层循环实现

  • 外层循环对除了第一个元素之外的所有元素
  • 内层循环对当前元素前面有序表进行待插入位置查找,并进行移动

脚本内容

#!/bin/bash
#插入排序
arr=(63 4 24 1 5 3)
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[@]}"

解析

  1. 设定比较轮数,轮数为长度减一。a也同样作为待排序元素下标 image.png

  2. 确定与待排序元素比较的元素下标范围,将待排序元素与已排序元素进行比较,较大的放在待排序元素位置,较小的放在已排序元素位置 image.png

运行效果

image.png