心得:
今天讲一些比较难理解的东西,如果应用得当将大幅度提高你的程序执行效率,每天进步一点点,加油~
7.编程的算法:
7.1用算法之前先学习一下shell的数组
在shell中,用 ( ) 来表示数组,数组元素之间用空格来分割,=号两边不可以有空格哦,一般格式为:
array=(num1 num2 num3 )
数组内的元素可以是数字型,也可以是字符型
array=(1 2 3 "hello shell")
赋值,给某个元素赋值
array[5]=66
获取数组内容
type | description |
---|---|
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