日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

shell中的排序算法示例代碼_linux shell

作者:即使不為人所道 ? 更新時間: 2022-03-16 編程語言

冒泡排序法

類似旗袍上涌的動作,會將數據在數組中從小大大或者從大到小不斷的向前移動。

基本思想:

冒泡排序的基本思想是對比相鄰的兩個元素值,如果滿足條件就交換元素值,把較小的元素移動到數組前面,把大的元素移動到數組后面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升到頂部。

算法思路

冒泡算法由雙層循環實現,其中外部循環用于控制排序輪數,一般為要排序的數組長度減1次,因為最后一次循環只剩下一個數組元素,不需要對比,同時數組已經完成排序了。而內部循環主要用于對比數組中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數隨排序輪數而減少。

#!/bin/bash
array=(112 221 33 55 66 11 25 68)
length="${#array[@]}"
for ((i=1; i<=$length; i++))
do
  for ((j=1; j<=$length-$i; j++))
  do
    first=${array[$j]}
    k=$[$j+1]
    second=${array[$k]}
    if [ $first -gt $second ]
      then
        temp=$first
        array[$j]=$second
        array[$k]=$temp
    fi
  done
done

echo "new_array: ${array[@]}"

在這里插入圖片描述

直接選擇排序

與冒泡排序相比,直接選擇排序的交換次數更少,所以速度會快些。

基本思想:

將指定排序位置與其它數組元素分別對比,如果滿足條件就交換元素值,注意這里區別冒泡排序,不是交換相鄰元素,而是把滿足條件的元素與指定的排序位置交換(如從最后一個元素開始排序),這樣排序好的位置逐漸擴大,最后整個數組都成為已排序好的格式。

#!/bin/bash
array=(77 22 99 1 23 55 11)
echo "老數組順序為 ${array[@]}"
length=${#array[@]}

for ((i=1; i<=length; i++))
do
  index=0
  for ((j=1; j<=length-i; j++))
  do
    CURR=${array[$j]}
    MAX=${array[$index]}
    if [ $CURR -gt $MAX ]
      then
        index=$j
    fi
  done
  last=$[ $length - $i ]
  temp=${array[$last]}
  array[$last]=${array[$index]}
  array[$index]=$temp

done

echo "新數組的順序為 ${array[@]}"

在這里插入圖片描述

在這里插入圖片描述

反轉排序

以相反的順序把原有數組的內容重新排序。

基本思想:

把數組最后一個元素與第一個元素替換,倒數第二個元素與第二個元素替換,以此類推,直到把所有數組元素反轉替換。

#!/bin/bash
array=(1 2 3 4 5 6 7 8 9)
length=${#array[@]}
for ((i=0; i<=length/2; i++))
do
  first=${array[$i]}
  last=${array[$length-$i-1]}
  temp=$first
  array[$i]=$last
  array[$length-$i-1]=$temp
done
echo "${array[*]}"

在這里插入圖片描述

在這里插入圖片描述

直接插入算法

插入排序,又叫直接插入排序。實際中,我們玩撲克牌的時候,就用了插入排序的思想。

基本思想:

在待排序的元素中,假設前n-1個元素已有序,現將第n個元素插入到前面已經排好的序列中,使得前n個元素有序。按照此法對所有元素進行插入,直到整個序列有序。

#!/bin/bash
array=(8 2 9 44 6 28 10)
echo "原數組為 ${array[*]}"
length=${#array[@]}
for ((i=1; i<=$length; i++))
do
  for ((j=0; j<=$i; j++))
    do
      if [[ ${array[$i]} -lt ${array[$j]} ]]
        then
           temp=${array[$i]}
           array[$i]=${array[$j]}
           array[$j]=$temp
      fi
    done
done

echo "新數組為 ${array[@]}"
~
~

在這里插入圖片描述

在這里插入圖片描述

希爾算法

希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序 。

基本思想

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

1.先選定一個小于N的整數gap作為第一增量,然后將所有距離為gap的元素分在同一組,并對每一組的元素進行直接插入排序。然后再取一個比第一增量小的整數作為第二增量,重復上述操作…

2.當增量的大小減到1時,就相當于整個序列被分到一組,進行一次直接插入排序,排序完成。

gap越大,數據挪動得越快;gap越小,數據挪動得越慢。前期讓gap較大,可以讓數據更快得移動到自己對應的位置附近,減少挪動次數。

在這里插入圖片描述

在這里插入圖片描述

#!/bin/bash
array=(8 9 1 7 2 3 5 4)
length=${#array[@]}
echo "原數組為 ${array[@]}"
#設長度的一半為gap初始間隔,每次循環gap都除以2,直至gap為1結束循環
for ((gap=$length/2; gap>0; gap/=2))
do
#因為gap為整個長度的一半,所以gap到length結尾包含的元素數剛好為需要進行直接插入算法的個數
  for ((i=gap; i<$length; i++))
    do
    #設一個第三變量方便直接插入進行交換
      temp=${array[$i]}
       #對距離為gap的元素組進行排序,每一輪比較拿當前輪次最后一個元素與組內其他元素比較,將數組大的往后放
      for((j=i-gap; j>=0&&temp<${array[$j]}; j-=gap))
        do
          array[$j+$gap]=${array[$j]}
        done
      array[$j+$gap]=$temp
    done
done

echo "新的數組為 ${array[*]}"

在這里插入圖片描述

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/weixin_44938203/article/details/122108491

欄目分類
最近更新