이 기사를 읽으면 더 이상 "배열 정렬 알고리즘"(버블 정렬 알고리즘, 직접 정렬 알고리즘, 역 정렬 알고리즘)에 대한 골칫거리가 없습니다.

버블 정렬 알고리즘 (버블 정렬)

알고리즘의 개요 및 기본 아이디어

  • 이 알고리즘의 이름의 유래는 탄산 음료의 이산화탄소 거품이 결국 맨 위로 올라가 듯이 원소가 더 작을수록 교환을 통해 시퀀스의 맨 위로 (오름차순 또는 내림차순) 천천히 "부유"하기 때문입니다. 따라서 이름은 "bubble"Sort "입니다.
  • 기본 아이디어 : 버블 정렬은 인접한 두 요소의 값을 비교하고, 해당 조건이 충족되면 서로 요소 값을 교환하고, 작은 요소를 배열의 맨 앞으로 이동하고, 더 큰 요소를 이동하는 것입니다. 요소를 배열의 뒷면에 추가 (즉, 두 요소의 위치를 ​​교환)하여 작은 요소가 거품처럼 아래쪽에서 위쪽으로 올라갑니다.
  • 알고리즘 아이디어 : 버블 링 알고리즘은 이중 루프로 실현됩니다.
    외부 루프는 정렬 라운드 수 (즉, 여러 라운드의 정렬 작업)를 제어하는 ​​데 사용됩니다. 일반적으로 정렬 할 배열의 길이는 "마이너스 1"입니다. "시간, 마지막 주기만 남았 기 때문에 다음 배열 요소를 비교할 필요가 없으며 배열이 이미 정렬되었습니다.
    내부 루프는 배열에서 인접한 각 요소의 크기를 비교하여 위치를 교환할지 여부를 결정하는 데 사용됩니다. 비교 및 ​​교환 횟수는 정렬 라운드 수에 따라 감소합니다.

분류 프로세스의 개략도

여기에 사진 설명 삽입

명령 스크립트

방법 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[@]}"

추천

출처blog.csdn.net/TaKe___Easy/article/details/114690492