버블 정렬 알고리즘 (버블 정렬)
알고리즘의 개요 및 기본 아이디어
분류 프로세스의 개략도
명령 스크립트
방법 1
[ root@localhost ~ ] # . /28. sh
需排序数组的值为:61 6 22 1 4 13
排序后的新数组值为:1 4 6 13 22 61
[ root@localhost ~ ] # vim 28. sh
#! / bin/ bash
sz= ( 61 6 22 1 4 13 )
echo "需排序数组的值为:${sz[@]}"
leng= ${
#sz[ @] }
【获取数组长度】
for ( ( w= 1 ; w< $leng; w++ ) )
【定义比较轮数,为数组长度减1 ,因为这里是小于,所以不用减1 ,并每次执行+ 1 的操作】
do
for ( ( e= 0 ; e< $leng- $w; e++ ) )
【因为这里的变量e是用来定义第一个比较元素的索引值,所以从0 开始,又因为最后一次比较是索引4 和索引5 进行比较,所以这里变量e的值小于数组长度
减变量w(减变量w而不直接减1 是因为待比较元素的位置需要随着轮数的增加而减少)】
do
one= ${
sz[ $e] }
【定义第1 个比较元素的值】
two= ${
sz[ $e+ 1 ] }
【定义第2 个比较元素的值】
if [ $one - gt $two ] ; then
【如果第1 个元素的值大于第2 个元素的值,则只需位置交换操作】
sz1= $one
【把第一个元素的值赋给临时变量sz1】
sz[ $e] = $two
【把第二个元素的值赋给第一个元素】
sz[ $e+ 1 ] = $sz1
【再把第一个元素的值(sz1的值)赋给第二个元素】
fi
done
done
echo "排序后的新数组值为:${sz[*]}"
방법 2 (정렬해야하는 배열 값을 수동으로 정의)
[ root@localhost ~ ] # . /28 - 1. sh
输入你需要排序的数组:33 2 28 5 44 32 18 29
需排序数组的值为:33 2 28 5 44 32 18 29
排序后的新数组值为:2 5 18 28 29 32 33 44
[ root@localhost ~ ] # vim 28 - 1. sh
#! / bin/ bash
read - p "输入你需要排序的数组:" num 【将需要排序的数组值赋给变量num】
sz= ( $num) 【与方式一的区别在于这里是通过变量num获取到值,而不是脚本内定义好值】
echo "需排序数组的值为:${sz[@]}"
leng= ${
#sz[ @] }
for ( ( w= 1 ; w< $leng; w++ ) )
do
for ( ( e= 0 ; e< $leng- $w; e++ ) )
do
one= ${
sz[ $e] }
two= ${
sz[ $e+ 1 ] }
if [ $one - gt $two ] ; then
sz1= $one
sz[ $e] = $two
sz[ $e+ 1 ] = $sz1
fi
done
done
echo "排序后的新数组值为:${sz[*]}"
방법 3 (알고리즘을 함수로 캡슐화하고 정렬 할 매개 변수를 함수를 통해 알고리즘에 전달)
[ root@localhost ~ ] # . /28 - 2. sh 88 91 102 32 45 27 1 13
需排序数组的值为:88 91 102 32 45 27 1 13
排序后的新数组值为:1 13 27 32 45 88 91 102
[ root@localhost ~ ] # vim 28 - 2. sh
sz= ( $@)
echo "需排序数组的值为:${sz[@]}"
leng= ${
#sz[ @] }
for ( ( w= 1 ; w< $leng; w++ ) )
do
for ( ( e= 0 ; e< $leng- $w; e++ ) )
do
one= ${
sz[ $e] }
two= ${
sz[ $e+ 1 ] }
if [ $one - gt $two ] ; then
sz1= $one
sz[ $e] = $two
sz[ $e+ 1 ] = $sz1
fi
done
done
echo "排序后的新数组值为:${sz[*]}"
}
#################main################# 【仅为注释从这以下为主代码】
list= $@ 【将命令行获取到的数组值赋给变量list】
paixu $list 【将变量list获得的值传参到函数paixu内】
직선 선택 정렬 (Straight Select Sorting)
알고리즘의 개요 및 기본 아이디어
분류 프로세스의 개략도
명령 스크립트
[ root@localhost ~ ] # . /29. sh
待排序的数组值为:63 4 24 1 3 15
排序后的数组值为: 1 3 4 15 24 63
[ root@localhost ~ ] # vim 29. sh
#! / bin/ bash
sz= ( 63 4 24 1 3 15 )
echo "待排序的数组值为:${sz[@]}"
leng= ${
#sz[ @] } 【定义排序的轮数】
for ( ( w= 1 ; w< $leng; w++ ) )
do
jx= 0 【假设所以为0 的元素是最大,并将值赋给jx】
for ( ( e= 1 ; e<= $leng- $w; e++ ) ) 【定义和第一个元素比较的索引,用来确定最大的元素索引】
do
max= ${
sz[ $jx] } 【定义最大的元素的值】
cs= ${
sz[ $e] } 【定义从索引1 开始比较的元素的值】
if [ $cs - gt $max ] ; then 【判断如果从索引1 开始比较的元素值大于当前最大元素的值时,则记录最大值的索引到变量jx】
jx= $e
fi
done
qz= $[ $leng- $w] 【定义每一轮比较的最后一个元素的索引】
qz1= ${
sz[ $qz] } 【把当前轮次的最后一个元素的值赋给临时变量qz1】
sz[ $qz] = ${
sz[ $jx] } 【把最大的值赋给当前轮次的最后一个元素】
sz[ $jx] = $qz1 【把qz1里的原来最后一个元素的值赋给原来最大值所在索引的元素】
done
echo "排序后的数组值为: ${sz[*]}"
역 정렬 알고리즘 (역 정렬)
알고리즘의 개요 및 기본 아이디어
명령 스크립트
[ root@localhost ~ ] # . /30. sh
待排序的数组为:3 4 24 31 43 65 89
反转排序后的数组顺序为:89 65 43 31 24 4 3
[ root@localhost ~ ] # vim 30. sh
#! / bin/ bash
sz= ( 3 4 24 31 43 65 89 )
echo "待排序的数组为:${sz[@]}"
leng= ${
#sz[ @] } 【输出数组sz的长度值并赋给变量leng】
for ( ( w= 0 ; w< $leng/ 2 ; w++ ) ) 【索引从0 开始,/ 2 是折半对调,所以是长度/ 2 ,且索引每次增加1 次】
do
one= ${
sz[ $w] } 【将第一个索引对应的元素赋值给变量one】
two= ${
sz[ $leng- 1 - $w] } 【将最后一个索引对应的元素赋给变量two】
sz1= $one
sz[ $w] = $two 【将最后一个索引对应的元素赋给第一个索引对应的元素】
sz[ $leng- 1 - $w] = $sz1 【将第一个索引对应的元素赋给最后一个索引对应的元素】
done
echo "反转排序后的数组顺序为:${sz[@]}"