目录
一、冒泡排序
?二 、直接选择排序
?三、反转排序
四、插入排序
一、冒泡排序
- 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
? ? ? ? 基本思想:冒泡排序的基本思想是对比邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
? ? ? ?算法思路:冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数的减少而减少。
#!/bin/bash
array=(60 20 30 50 10 40)
echo "原数组参数顺序为:${array[*]}"
for ((i=1;i<${#array[*]};i++))
do
for ((a=0;a<${#array[*]}-i;a++))
do
if [ ${array[$a]} -gt ${array[$a+1]} ]
then
temp=${array[$a]}
array[$a]=${array[$a+1]}
array[$a+1]=$temp
fi
done
done
echo "经过冒泡排序后,数组顺序为:${array[*]}"
?
?二 、直接选择排序
- 与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。
? ? ? ? 基本思想:将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
? ? ? ? 算法思路:index记录最大元素的下标,啊记录当前轮数的最后一个比较元素的下标。外循环控制比较轮数,内循环用于指定当前轮数的最后一个比较轮数(找最大的元素下标的范围)
#!/bin/bash
arr=(63 4 24 1 3 15)
echo "老数组的顺序为:${arr[@]}"
length=${#arr[@]}
#定义比较的轮数,还是数组长度减1
for ((a=1; a<length; a++ ))
do
#定义当前比较轮中拥有最大值的元素下标的初始值为0
index=0
#定义当前比较轮的除了第一个元素的其他比较元素的下标的范围,会随着比较轮数的增加而减少,从1开始
for ((b=1; b<=length-a; b++ ))
do
#获取其他比较元素的值
OTHER=${arr[$b]}
#获取当前比较轮中最大元素的值
MAX=${arr[$index]}
#通过拿其他比较元素的值与最大元素的值比较,获取当前比较轮的最大元素的下标
if [ $OTHER -gt $MAX ];then
index=$b
fi
done
#拿当前比较轮的最大元素的值与当前比较轮最后一个元素的值进行交换
#获取当前比较轮的最后一个元素的下标
last=$[$length - $a]
#使用临时变量temp,获取当前最后一个元素的值
temp=${arr[$last]}
#把当前轮最大的元素的值赋给最后一个元素
arr[$last]=${arr[$index]}
#把原来最后一个元素的值赋给原最大的元素
arr[$index]=$temp
done
echo "排序后的宿主顺序为:${arr[@]} "
[root@localhost ~]# bash test1.sh
老数组的顺序为:63 4 24 1 3 15
排序后的宿主顺序为:1 3 4 15 24 63
?
?三、反转排序
? ? ? ? 基本思想:把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。
#!/bin/bash
arr=(10 20 30 40 50 60)
echo "排序前的数组顺序为:${arr[@]}"
length=${#arr[@]}
#拿折半的前几个数作为参照物
for ((a=0; a<length/2; a++))
do
#获取折半前面的数值
front=${arr[$a]}
#获取折半后面的数值
backend=${arr[$length-1-$a]}
#前后值进行交换
temp=$front
arr[$a]=$backend
arr[$length-1-$a]=$temp
done
echo "排序后的数组顺序为:${arr[@]}"
四、插入排序
- 插入排序,又叫直接插入排序。实际中,我们玩扑克牌的时候,就用了插入排序的思想
- 基本思想 : 在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
?
#!/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
WAITER=${arr[$a]}
FINISH=${arr[$b]}
#升序排序,所以如果待排序的元素值下于前面已经排序好的元素的值,则进行交换,小的往前放,大的往后放
if [ $WAITER -lt $FINISH ];then
temp=$WAITER
arr[$a]=$FINISH
arr[$b]=$temp
fi
done
done
echo "排序后的数组顺序为:${arr[@]} "
|