陣列基本操作及陣列排序演算法(冒泡演算法,直接選擇排序,反轉排序)
陣列
一.前言
以‘’括起來的中間由空格的為列表,以()括起來中間空格的為陣列,陣列中不一定是陣列也可以是字母,字串,裡面的每一個字元叫元素,元素下標(數引),從0開始
‘a b c d 10 20’
(30 20 10 60 50 40)
0 1 2 3 4 5
陣列包括的資料型別
(一)數值型別
(二)字元型別,使用“”或‘’定義
二.陣列的定義方法
方法一:
格式:陣列名=(value0 value1 value2 ........)
方法二:
格式:陣列名=([0]=value [1]=value [2]=value....)
這種方法前面 [ ]部分為數組裡面元素的下標,從0開始,即使順序混亂也會按照下標0 1 2 3.....
方法三:
格式:列表名=“value0 value1 value2......”
陣列名=($列表名)
方法四:
格式:陣列名[0]=“value”
陣列名[1]=“value”
陣列名[2]=“value”
三.獲取陣列值,獲取陣列長度
(一)獲取陣列值
格式:echo ${陣列名[@]} 或者 echo ${陣列名[*]}
(二)獲取陣列長度
格式:echo ${#陣列名[@]}
(三)讀取某下標賦值
格式:echo ${#陣列名[下標]}
四.陣列遍歷
使用迴圈讀取陣列內容進行遍歷
注意:如果讀取陣列加上雙引號,陣列內容讀取中[ ]
五.陣列切片
格式:echo ${陣列名[@]:起始位置:長度}
六.陣列替換
數字替換字元會替換匹配到的所有字元,
格式:echo ${陣列名[@或*]/查詢字元/替換字元}
但是並不會替換陣列原有的內容,只是臨時替換內容輸出
要實現改變原有陣列,可通過重新賦值實現
示例:abc=($abc[@]/20/50)
echo ${abc[@]}
也可以使用定義某個元素的值來改變
示例:abc[2]=50
如果不按照元素下標修改會將匹配到所有的元素都更改
七.刪除陣列
格式:unset 陣列名 刪除陣列
或者 unset 陣列名[下標]
如果刪除的下標為中間某一個,下標順序不會往前縮排,只是該下標數值為空
八.變數追加元素
方法一:單個新增
格式:陣列[下標]=元素
方法二:在不進行任何刪減時,直接使用陣列長度追加元素
格式:陣列[${#陣列[@]}]=元素
但是如果定義時漏了某個元素,使用該方法可能直接修改某個元素
方法三:直接獲取源陣列的全部元素再加上新要新增的元素,一併重新賦予該陣列,重新重新整理定義索引
格式:陣列=([“${陣列[@]}”‘新元素1’‘新元素2’)
雙引號不能省略,否則,當陣列中存在包含空格的元素時會按空格將元素拆分成多個不能將"@"替換為"*",如果替換為"*",不加雙引號時與"@"的表現一致,加雙引號時,會將陣列中的所有元素作為一個元素新增到新的陣列中,如果新增的新元素不是數字需要加上雙引號或者單引號
方法四:待新增元素必須用“()”包圍起來,並且多個元素用空格分隔
格式:陣列+=(元素1 元素2 .....)
九.向函式傳陣列引數
如果將陣列變數作為函式引數,函式只會取陣列變數的第一個值
想要完成獲取引數
函式獲取陣列引數並進行*2輸出
陣列排序演算法
一.氣泡排序
類似氣泡上湧的動作,會將資料在陣列中從小到大或者從大到小不斷的向前移動
基本思想
氣泡排序的基本思想是對比相鄰的兩個元素值,如果滿足條件就交換元素值,把較小的元素移動到陣列前面,把大的元素移動到陣列後面 (也就是交換兩個元素的位置),這樣較小的元素就像氣泡一一樣從底部上升到頂部
演算法思路
冒泡演算法由雙層迴圈實現,其中外部迴圈用於控制排序輪數,一般為要排序的陣列長度減1次,因為最後一次迴圈只剩下一個數組元素,不需要對比, 同時陣列已經完成排序了。而內部迴圈主要用於對比陣列中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數隨排序輪數而減少
示例:
二.直接選擇排序
與氣泡排序相比,直接選擇排序的交換次數更少,所以速度會快些
基本思想∶
將指定排序位置與其它陣列元素分別對比,如果滿足條件就交換元素值,注意這裡區別氣泡排序, 不是交換相鄰元素, 而是把滿足條件的元素與指定的排序位置交換 (如從最後一一個元素開始排序) ,這樣排序好的位置逐漸擴大, 最後整個陣列都成為已排序好的格式
示例:
三.反轉排序
以相反的順序把原有陣列的內容重新排序
基本思想:
把陣列最後一個元素與第一個元素替換,倒數第二個元素與第二個元素,以此類推,直到把所有陣列元素反轉替換
示例: