第七篇 算法排序篇,冒泡法和选择排序法 以及shell数组用法

心得:
今天讲一些比较难理解的东西,如果应用得当将大幅度提高你的程序执行效率,每天进步一点点,加油~

7.编程的算法:

7.1用算法之前先学习一下shell的数组

在shell中,用 ( ) 来表示数组,数组元素之间用空格来分割,=号两边不可以有空格哦,一般格式为:

array=(num1 num2 num3 )

数组内的元素可以是数字型,也可以是字符型

array=(1 2 3 "hello shell")

赋值,给某个元素赋值

array[5]=66

获取数组内容

typedescription
n=${array[1]}取出第二个元素的值
${array[*]} or ${array[@]}取出所有元素值
${#array[@]} or ${#array[*]}获取数组长度
array=(${array1[@]} ${array2[@]})合并数组

看个小例子:

tianjain@tianjain-TM1701:~$ array=(1 2 3 "hello shell")
tianjain@tianjain-TM1701:~$ array[4]=5          #插入元素
tianjain@tianjain-TM1701:~$ echo ${array[@]}	#获取全部元素
1 2 3 hello shell 5
tianjain@tianjain-TM1701:~$ echo ${array[*]}
1 2 3 hello shell 5
tianjain@tianjain-TM1701:~$ echo ${array[3]}	#获取第四个元素
hello shell
tianjain@tianjain-TM1701:~$ echo ${#array[@]}	#获取数组长度
5
tianjain@tianjain-TM1701:~$ echo ${#array[*]}
5
tianjain@tianjain-TM1701:~$ array1=(1 2) 	#数组的合并
tianjain@tianjain-TM1701:~$ array2=(3 "hello tian")
tianjain@tianjain-TM1701:~$ array=(${array1[@]} ${array2[@]})
tianjain@tianjain-TM1701:~$ echo ${array[@]}
1 2 3 hello tian

7.2 冒泡算法:
什么是冒泡算法,顾名思义将锅里的水(元素)一个一个蒸发出来,当那一滴水先达到100度,先蒸发那一滴,然后以此排好顺序。
A1 A2 A3 A4 A5
五个元素,A1和A2比,如果A1大,则交换位置; A2和A3比,如果A2大,则交换位置,以此类推,第一次比较则找出了最大的元素,然后继续A1和A2比较,找出第二大的数字,以此类推,四个循环可以将五个元素的数组排好顺序,来看看shell的代码把:

#!/bin/bash

arrs=(9 5 2 7 0 )
echo 初始顺序 ${arrs[@]}
b=${#arrs[@]}

 for i in $(seq 1 $(($b-1)))
 do
 	echo 第$i次排序
 	for j in $(seq 0 $(($b-1)))
 	do
 	 	#echo $j
 	 	if [[ ${arrs[j]} -gt ${arrs[j+1]} ]];then
 	 		tmp=${arrs[j]}
 	 		arrs[j]=${arrs[j+1]}
 	 		arrs[j+1]=$tmp

 	 	fi
	done
	echo ${arrs[@]}
 done

echo 最终顺序 ${arrs[@]}

看看输出吧:

tianjain@tianjain-TM1701:~$ ./test.sh 
初始顺序 9 5 2 7 0
第1次排序
5 2 7 0 9
第2次排序
2 5 0 7 9
第3次排序
2 0 5 7 9
第4次排序
0 2 5 7 9
最终顺序 0 2 5 7 9
tianjain@tianjain-TM1701:~$ 

每一次都会取最大的值依次交换顺序,来达到排序的目的

7.3选择排序算法的实现:
选择排序法是指定第一位数字为最小,依次和后续的元素比较,当遇到比它更小的则交换位置,比它更大的则不动;直到遇到尾元素则进行下一次遍历,依次循环下去则得出最终顺序。

直接上代码:

#!/bin/bash
arrs=(9 5 2 7 0 8 99 22)
echo 初始顺序 ${arrs[@]}
echo ${#arrs[@]}
b=${#arrs[@]}
for j in $(seq 0 $(($b-1)))
 	do
 		#echo j $j
 		for min in $(seq $(($j+1)) $(($b-1)))
 		do
 			#echo min $min
 			if [[ ${arrs[j]} -gt ${arrs[min]} ]];then
 				tmp=${arrs[j]}
 	 			arrs[j]=${arrs[min]}
 	 			arrs[min]=$tmp
 	 			#echo ${arrs[@]}
 	 		fi
 	 	done
 	 	echo 第 $j 次排序顺序 ${arrs[@]}
 	done
 	
echo 最终顺序 ${arrs[@]}

输出结果:

tianjain@tianjain-TM1701:~$ ./test2.sh 
初始顺序 9 5 2 7 0 8 99 22
8
第 0 次排序顺序 0 9 5 7 2 8 99 22
第 1 次排序顺序 0 2 9 7 5 8 99 22
第 2 次排序顺序 0 2 5 9 7 8 99 22
第 3 次排序顺序 0 2 5 7 9 8 99 22
第 4 次排序顺序 0 2 5 7 8 9 99 22
第 5 次排序顺序 0 2 5 7 8 9 99 22
第 6 次排序顺序 0 2 5 7 8 9 22 99
第 7 次排序顺序 0 2 5 7 8 9 22 99
最终顺序 0 2 5 7 8 9 22 99

附录:
数组中shell的$(seq 0 10)表示从零开始到10结束,包含10
而python中数组range(0,10)表示从零开始到9结束,不包含10
看实例:

shell:

tianjain@tianjain-TM1701:~$ for i in $(seq 1 10);do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10

python

>>> for i in range(1,10):
... 	print(i)
... 
1
2
3
4
5
6
7
8
9

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值