目录
一、选择排序
1.基本思想
2.直接选择排序的流程
3.实验
二、直接插入排序法
1.基本思想
2.直接插入排序法的流程
3.实验
三、反向排序
1.实验
一、选择排序
与冒泡排序相比,直接选择排序的交换次数更少,所以速度会更快。
1.基本思想
指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,把满足条件的元素与指定的排序位置交换,这样排序好的位置会逐渐扩大,最后整个数组都成为以排序好的格式。与冒泡排序的区别在于,冒泡排序将相邻两个元素间的交换位置,而选择排序是将元素与指定排序位置交换。
2.直接选择排序的流程
从小到大排序
- 在代排序的序列中定义第一个元素为最大元素。
- 将第一个元素与其他元素比较,当出现比第一个元素大的值,就将两者之间位置调换;比较结束后,第一元素位置就是最大值,然后将最大值与最后一位元素交换位置。
- 最大值确定后,依次比较第二大的元素,轮番比较后,数组就由小到大排序完成。
3.实验
#!/bin/bash
#定义函数
XUANZE() {
array=($@)
length=${#array[@]}
#外层循环控制元素比较的轮数,从1开始,最大轮数为数组长度-1
for ((i=1;i<length;i++))
do
#定义最大元素的下标为0,即第一个元素最大
a=0
#内层循环控制与最大值比较的元素的下标,下标会随着轮数的提高而减少
for ((b=1;b<=length-i;b++))
do
#比较元素大小
#if [ ${array[$a]} -gt ${array[$b]} ] 从大到小排序,就获取最小元素下标
if [ ${array[$a]} -lt ${array[$b]} ] 从小到大排序,获取最大元素的下标
then
a=$b
fi
done
#定义数组中最后一位元素的下标
last=$[ length - i ]
#将最后一位元素的值赋予变量tmp
tmp=${array[$last]}
#将最大元素的值赋予数组中最后一位
array[$last]=${array[$a]}
#将原本最后一位的值交换到第一位
array[$a]=$tmp
done
echo "排序后的数组为:${array[@]}"
}
###main###
read -p "输入需要排序的数组:" num
XUANZE $num
二、直接插入排序法
1.基本思想
在待排序的元素中,假设前 n-1 个元素已有序,现将第 n 个元素插入到前面已经排好的序列中,使得前 n 个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中,直到整个序列有序为止。
2.直接插入排序法的流程
从小到大排序
- 第一位元素设定为有序,
- 第二位元素与第一位元素比较,2号元素比1号元素小,二者位置交换,头两个元素变成有序;
- 第三位元素与前两个元素比较,比1号元素大就不执行操作,比2号元素小位置互换,如此前3个元素变为有序;
- 然后依次比较,直到数组中元素从小到大排列。
3.实验
#!/bin/bash
CHARU() {
array=($@)
length=${#array[@]}
#外层循环控制比较轮数
for ((a=1;a<length;a++))
do
#内层循环控制要插入元素的比较次数
for ((b=0;b<a;b++))
do
#判断元素需要插入的位置,将待排序元素与已排序好的元素依次比较
#if [ ${array[a]} -gt ${array[b]} ] #较大的数向前排,较小的数向后排
if [ ${array[a]} -lt ${array[b]} ] #较小的数向前排,较大的数向后排
then
#将原有元素的值定义为变量tmp
tmp=${array[a]}
#将两个元素位置置换
array[a]=${array[b]}
array[b]=$tmp
fi
done
done
echo "排序后的数组值为:${array[@]}"
}
###main###
read -p "输入需排序的数组:" num
CHARU $num
三、反向排序
将原本排序好的数组反向排序,即原本从小到大排序,现在从大到小排。
1.实验
FANXIANG() {
array=($@)
length=${#array[@]}
for ((a=0;a<length/2;a++))
do
tmp=${array[a]}
#获取当前轮数的最后一个元素下标,下标会随着轮数的增加而减少
last=$[length-1-a]
array[$a]=${array[$last]}
array[$last]=$tmp
done
echo "反向输出数组的值:${array[@]}"
}
###main###
read -p "输入一个数组:" num
FANXIANG $num
~