冒泡排序
原理
对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面,也就是交换两个元素的位置。
算法思路
冒泡算法由双层循环实现
- 外部循环用于控制排序轮数,一般为要排序的数组长度减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次,因为最后一次循环只剩下一个数组元素,不需要对比,且数组已经完成排序
- 内部循环主要用于选出剩余未排序的数中最大的数,然后交换到后面的位置
脚本内容
#!/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[@]}"
解析
-
获取数组长度,外层循环决定轮数,默认下标为0的数最大
-
定义内循环变量为从第二个元素下标开始,用于比较当前假设的最大元素的值,并记录最大元素的下标
-
获取每轮最后一个比较元素的下标,拿最大的元素和当前轮数的最后一个比较元素交换
运行效果
反转排序
原理
将一个按一定顺序排列(升序或降序)的数组,换个排序方式排列(升序变降序,降序变升序)。
算法思路
从外向内每对数交换值,直到全部交换过结束。如果总数是奇数个,那么中间的数不用管。
脚本内容
#!/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循环,从外向内读取数,每对数交换值。
运行效果
插入排序
原理
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。
按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
算法思路
插入排序算法使用双层循环实现
- 外层循环对除了第一个元素之外的所有元素
- 内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
脚本内容
#!/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[@]}"
解析
-
设定比较轮数,轮数为长度减一。a也同样作为待排序元素下标
-
确定与待排序元素比较的元素下标范围,将待排序元素与已排序元素进行比较,较大的放在待排序元素位置,较小的放在已排序元素位置