选择排序,直接插入排序

目录

一、选择排序

1.基本思想

2.直接选择排序的流程  

3.实验

二、直接插入排序法 

1.基本思想

2.直接插入排序法的流程

3.实验 

三、反向排序

1.实验


 

一、选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会更快。

1.基本思想

指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,把满足条件的元素与指定的排序位置交换,这样排序好的位置会逐渐扩大,最后整个数组都成为以排序好的格式。与冒泡排序的区别在于,冒泡排序将相邻两个元素间的交换位置,而选择排序是将元素与指定排序位置交换。

2.直接选择排序的流程  

从小到大排序

  1. 在代排序的序列中定义第一个元素为最大元素。
  2. 将第一个元素与其他元素比较,当出现比第一个元素大的值,就将两者之间位置调换;比较结束后,第一元素位置就是最大值,然后将最大值与最后一位元素交换位置。
  3. 最大值确定后,依次比较第二大的元素,轮番比较后,数组就由小到大排序完成。

  

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.直接插入排序法的流程

从小到大排序

  1. 第一位元素设定为有序,
  2. 第二位元素与第一位元素比较,2号元素比1号元素小,二者位置交换,头两个元素变成有序;
  3. 第三位元素与前两个元素比较,比1号元素大就不执行操作,比2号元素小位置互换,如此前3个元素变为有序;
  4. 然后依次比较,直到数组中元素从小到大排列。

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
~                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值