쉘 스크립트에서 버블 정렬, 직접 정렬 및 역 정렬

하나, 버블 정렬

여기에 사진 설명 삽입

거품의 급증과 유사하게 데이터는 어레이에서 계속해서 소형에서 대형으로 또는 대형에서 소형으로 이동합니다.

기본 개념 :
버블 정렬의 기본 개념은 인접한 두 요소의 값을 비교하는 것입니다. 조건이 충족되면 요소 값이 교환되고 작은 요소가 배열의 맨 앞으로 이동합니다. 큰 요소는 배열의 뒤쪽으로 이동하여 (즉, 각 요소의 위치를 ​​두 개 교환) 작은 요소가 거품처럼 아래쪽에서 위쪽으로 올라갑니다.

알고리즘 아이디어 :
버블 링 알고리즘은 이중 레이어 루프로 구현되며, 여기서 외부 루프는 정렬 라운드 수를 제어하는 ​​데 사용됩니다. 일반적으로 정렬 할 배열의 길이는 하나의 배열 만 있기 때문에 1 씩 줄어 듭니다. 요소가 마지막 루프에 남아 있으며 비교가 필요하지 않습니다. 정렬이 완료되었습니다. 내부 루프는 배열에서 인접한 각 요소의 크기를 비교하여 위치를 교환할지 여부를 결정하는 데 주로 사용되며, 정렬 라운드 수에 따라 비교 및 ​​교환 횟수가 감소합니다.


#!/bin/bash
#冒泡排序

arr=(10 44 55 24 33 78 11)             #这里是我自己定义得数组arr
length=${#arr[@]}
echo "原数组为:${arr[@]} "
for((i=1;i<${#arr[@]};i++))            #外部循环,控制轮次
do
   for ((j=0;j<${#arr[@]}-$i;j++))     #内部循环,控制每轮比较次数
   do

   if [ ${arr[$j]} -gt ${arr[$j+1]} ]  #对每轮从头开始得相邻两个数进行比较,小的上浮(放前面),大的下沉(放后面替换位置) 
   then
   temp=${arr[$j]}                     #这里把前一个定义给一个变量temp
   arr[$j]=${arr[$j+1]}                #如果前一个大于后一个,则两两交换位置
   arr[$j+1]=$temp

   fi

   done
done
   echo "冒泡排序完得数组为:${arr[@]} "



성공!
여기에 사진 설명 삽입

둘째, 직접 정렬

여기에 사진 설명 삽입

버블 정렬에 비해 직접 선택 정렬은 교환 수가 적기 때문에 더 빠릅니다.

기본 개념 :
지정된 정렬 위치를 다른 배열 요소와 개별적으로 비교합니다. 조건이 충족되면 요소 값이 교환됩니다. 여기서 버블 정렬이 구별됩니다. 인접한 요소를 교환하는 대신 조건을 충족하는 요소가 교환됩니다. 지정된 정렬 위치 (예 : 마지막 요소에서 정렬)를 사용하여 정렬 된 위치가 점차 확장되고 마지막으로 전체 배열이 정렬 된 형식이됩니다.


#!/bin/bash
#直接排序

arr=(10 44 55 24 33 78 11)
echo "原先得数组为:${arr[@]} "
length=${#arr[@]}
for ((i=1;i<$length;i++))
do
    index=0                                #定义一个index变量,用来接收
    for ((j=1;j<=$length-i;j++))           #这里我用的是<=因为我下面用的是 -lt 来判断的,所以这里需要<=
    do
     if [ ${arr[$index]} -lt ${arr[$j]} ]  #这里我用的是小于
     then
       index=$j

     fi

       last=$[ $length - $i ]
       temp=${arr[$last]}
       arr[$last]=${arr[$index]}

       arr[$index]=$temp

    done
done
    echo "直接排序完得数组为:${arr[@]} "


여기에 사진 설명 삽입

세, 역 정렬

원래 배열의 내용을 역순으로 재정렬

기본 아이디어 :
배열의 마지막 요소를 첫 번째 요소로 바꿉니다. 두 번째 요소는 모든 배열 요소가 반전되고 대체 될 때까지 두 번째 요소로 대체됩니다.

#!/bin/bash
#直接排序

arr=(10 44 55 24 33 78 11)
echo "原先得数组为:${arr[@]} "
length=${#arr[@]}
for ((i=1;i<$length;i++))
do
    index=0
    for ((j=1;j<=$length-i;j++))
    do
     if [ ${arr[$index]} -lt ${arr[$j]} ]
     then
       index=$j

     fi

       last=$[ $length - $i ]      #从这里开始,以下就是首尾替换。
       temp=${arr[$last]}
       arr[$last]=${arr[$index]}

       arr[$index]=$temp

    done
done
    echo "直接排序完得数组为:${arr[@]} "


여기에 사진 설명 삽입

추천

출처blog.csdn.net/weixin_44324367/article/details/114818318