陣列基本操作及冒泡演算法、直接選擇排序

leec。發表於2020-12-24

陣列

一、陣列定義方法

方法一:
陣列名=(value0 value1 value2 …)

在這裡插入圖片描述

方法二:
陣列名=([0]=value [1]=value [2]=value …)

在這裡插入圖片描述

方法三:
列表名=“value0 value1 value2 …”
陣列名=($列表名)

在這裡插入圖片描述

方法四:
陣列名[0]=“value”
陣列名[1]=“value”
陣列名[2]="value"

在這裡插入圖片描述

二、陣列包括的資料型別

數值型別
字元型別(字串):使用" "或’ '定義,防止元素當中有空格,元素按空格分割

三、獲取陣列長度

abc=(1 2 3 4 5 6 7 8)                #定義陣列
echo $(#abc[*])或者echo $(#abc[@])   #獲取陣列長度

在這裡插入圖片描述

1、讀取某索引賦值

abc=(1 2 3 4 5 6 7 8)
echo ${abc[0]}

echo ${abc[1]}

echo ${abc[5]

在這裡插入圖片描述

四、陣列遍歷

[root@promote d3]#vim 3.sh
#!/bin/bash
arr=(5 4 3 2 1)

for i in ${arr[@]}
do

     echo $i

done

在這裡插入圖片描述
在這裡插入圖片描述

五、陣列切片

arry=(1 2 3 4 5 6)
echo ${arry[*]}           

echo ${arry[@]}       #輸出整個陣列,此處*與@相同

echo ${arry[@]:0:2}   #獲取 ${陣列名[@或*]:起始位置:長度} 的值

echo ${arry[@]:2:2}

echo ${arry[@]:3:4}

在這裡插入圖片描述

六、陣列替換

方法一:單個替換

arry=(1 2 3 4 5 6)

echo ${arry[*]}

arry[0]=66

echo ${arry[*]}

在這裡插入圖片描述
方法二:多個替換臨時替換

echo ${arry[*]/6/77}    #臨時替換

echo ${arry[*]}         #原來的值不變

在這裡插入圖片描述
方法三:多個替換,永久替換

arrp=${arry[*]/6/88}

arry=($arrp)

echo ${arry[*]}

在這裡插入圖片描述

七、陣列刪除

echo ${arry[*]}

unset arry             #刪除整個陣列

echo ${arry[*]}

在這裡插入圖片描述

arr=(1 2 3 4 5 6 7)
echo ${arr[*]}

unset arr[5]           #刪除陣列中選擇索引對應的元素
echo ${arr[*]}

echo ${arr[6]}

在這裡插入圖片描述

八、陣列追加元素

方法一:單個新增

arr=(1 2 3 4 5 6 7)
echo ${arr[6]}
arr[7]=8
arr[8]=9
echo ${arr[*]}

在這裡插入圖片描述
方法二:在不進行任何刪減時,索引最大值,就是元素長度減一
在這裡插入圖片描述在這裡插入圖片描述
方法三:直接獲取源陣列的全部元素再加上新要新增的元素,一併重新賦予該陣列,重新重新整理定義索引

arr=(1 2 3 4 5 6 7)
echo ${arr[*]}

unset arr[2]
unset arr[4]

echo ${arr[*]}
echo ${arr[6]}
echo ${arr[5]}
echo ${arr[4]}
echo ${arr[2]}

arr=("${arr[@]}" 8 9 10)
echo ${arr[*]}
echo ${arr[4]}
echo ${arr[2]}

雙引號不能省略,否則陣列中存在包含空格的元素時會按空格將元素拆分成多個
不能將“@”替換為“*”,如果替換為“* ”,不加雙引號時與“@”的表現一致,加雙引號時,會將陣列array_name中的所有元素作為一個元素新增到陣列中

在這裡插入圖片描述
方法四:待新增元素必須用“()”包圍起來,並且多個元素用空格分隔

arr+=(10 11 12 ...)

在這裡插入圖片描述

九、向函式傳陣列引數

test2() {
newarrary=($(echo $@))
   echo "新陣列的值為:${newarrary[*]}"

}

array=(3 2 1 4 5)
echo "原始陣列的值為:${array[*]}"
test2 ${array[*]}

在這裡插入圖片描述
在這裡插入圖片描述

十、排序演算法

1、氣泡排序演算法

在這裡插入圖片描述

類似氣泡上湧的動作,會將資料在陣列中從小到大或者從大到小不斷的向前移動。

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

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

#!/bin/bash

array=(60 20 30 50 10 40)
echo "原陣列元素順序為:${array[*]}"

for ((i=1;i<${#array[*]};i++))
do
    for ((a=0;a<${#array[*]}-i;a++))
    do

    if [ ${array[$a]} -gt ${array[$a+1]} ]
    then
  
    temp=${array[$a]}
      
    array[$a]=${array[$a+1]} 

    array[$a+1]=$temp  

 fi


     done
done
    echo "經過氣泡排序後,陣列順序為:${array[*]}"

在這裡插入圖片描述

2、直接選擇排序

在這裡插入圖片描述

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

基本思想:
將指定排序位置與其他陣列元素分別對比,如果滿足條件就交換元素值,注意這裡區別氣泡排序,不是交換相鄰元素,而是把滿足條件的元素與指定的排序位置交換(如從最後一個元素開始排序),這樣排序好的位置逐漸擴大,最後整個陣列都成為已排序好的格式。

#!/bin/bash
array=(7 6 3 2 1 4)
echo "原陣列元素順序為:${array[*]}"

long=${#array[*]}
for ((i=1;i<$long;i++))
do
  index=0
   for ((a=1;a<=$long-$i;a++))
   do

    if [ ${array[$a]} -gt ${array[$index]} ]
    then
    index=$a
    fi
   last=$[$long-$i]

   temp=${array[$last]}
   array[$last]=${array[$index]}
   array[$index]=$temp

   done
done

    echo "經過直接排序後陣列元素順序為:${array[*]}"

在這裡插入圖片描述
在這裡插入圖片描述

相關文章