Ausführliche Erklärung zum Sortieren des Shell-Programmierarrays und des Blasenalgorithmus

Vier Ausdrücke eines Arrays

Methode 1:
Array-Name = (Wert0 Wert1 Wert2…)
Methode 2:
Array-Name = ([0] = Wert [1] = Wert [2] = Wert)
Methode 3:
Listenname = "Wert0 Wert1 Wert2 ..."
Array-Name = ($ Listenname)
Methode 4:
Arrayname [0] = "Wert"
Arrayname [1] = "Wert"
Arrayname [2] = "Wert"
……

Hinzufügen, Löschen, Ändern und Überprüfen des Betriebs von zwei Arrays

Holen Sie die Länge des Arrays
arr_length = $ {# arr_number [*]}
Array - Slice

[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# echo ${a[*]}  		//输出整个数组
1 2 3 4 5
[root@localhost ~]# echo ${a[@]:0:2}  #${数组名[@或*]:起始位置:长度]
1 2 
[root@localhost ~]# echo ${a[@]:2:3}
3 4 5
注意:将数组切片之后,返回的是字符串,以空格作为分隔符

Array-Ersatz

arr=(1 2 3 4 5)
echo ${arr[@]/4/66}  //${数组名[@或*]/查找字符/替换字符}
1 2 3 66 5
echo ${arr[@]}       //并不会替换数组原有内容
1 2 3 4 5
a=(${arr[@]/4/66})		//要实现改变原有数组,可通过重新赋值实现
echo ${arr[*]}
1 2 3 66 5

Array löschen

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr		//删除整个数组

[root@localhost ~]# unset arr[2]		//删除第三个元素
[root@localhost ~]# echo ${arr[*]}
1 2 4 5

Element zum Array hinzufügen

方法1 array_name[index]=value
方法2 array_name[${#array_name[@]}]=value
方法3 array_name=("${array_name[@]}" value1 ... valueN)
方法4 array_name+=(value1 value 2 ... valueN)

Fügen Sie hier eine Bildbeschreibung ein

Hinweis:
Die doppelten Anführungszeichen in "$ {array_name [@]}" können nicht weggelassen werden. Andernfalls wird
das Element durch das Leerzeichen in mehrere Teile geteilt, wenn ein Element mit einem Leerzeichen im Array array_name angezeigt wird

Sie können @ nicht durch * ersetzen, da sonst alle Elemente im Array array_name dem Array als ein Element hinzugefügt werden, wenn Sie doppelte Anführungszeichen hinzufügen
Fügen Sie hier eine Bildbeschreibung ein

Drei Gruppen von Parametern

3.1 Das Hauptprogramm übergibt Array-Parameter an die Funktion

Die folgenden Probleme können beim Aufrufen von Arrays in Funktionen auftreten

#!/bin/bash
test1() {
    
    
echo "函数接收到的列表为:$@"
newarray=$1
echo ${newarray[*]}
}
array=(3 2 1 4 5)
echo "原始的数组值为${array[*]}"
test1 $array

Das Ergebnis der Operation ist in der folgenden Abbildung dargestellt.
Fügen Sie hier eine Bildbeschreibung ein
Zu diesem Zeitpunkt müssen Sie die Werte der Array-Variablen in einzelne Werte zerlegen und diese Werte dann als Funktionsparameter verwenden. Innerhalb der Funktion werden alle Parameter zu einer neuen Array-Variablen zusammengefasst.
Der Demo-Code lautet wie folgt:

#!/bin/bash
test2() {
    
    
newarray=($(echo $@))		//$@会把接收到的所有的位置参数都表示出来,并且分割成单个元素。此处也可以写成newarray=($@)
echo "新数组的值为:${newarray[*]}"
}
array=(3 2 1 4 5)
echo "原始的数组值为${array[*]}"
test2 ${array[*]}		//此处{
    
    }必加,表示把这个数组看作一个整体

Die Ergebnisse sind wie folgt
Fügen Sie hier eine Bildbeschreibung ein

3.2 Array von Funktion zu Hauptprogramm zurückgeben

test3() {
    
    
newarray=(`echo $@`)
for((i=0;i<$#;i++))
{
    
    
newarray[$i]=$[${newarray[$i]}*2]
}
echo ${newarray[*]}
}

array=(3 2 1 4 5)
result=($(test3 ${
     
     array[*]}))
echo "新数组的值为:${result[*]}"

Sortierung mit vier Blasenalgorithmen

Die Blasensortierung
ähnelt der Aktion aufsteigender Blasen, bei der die Daten im Array von klein nach groß oder von groß nach klein verschoben werden.

Grundidee:
Die Grundidee der Blasensortierung besteht darin, die Werte zweier benachbarter Elemente zu vergleichen, die Elementwerte auszutauschen, wenn die Bedingungen erfüllt sind, und das kleinere Element auf die Rückseite des Arrays zu verschieben (dh die Positionen der beiden Elemente auszutauschen), damit es kleiner ist Die Elemente steigen wie Blasen von unten nach oben.

Algorithmusidee Der
Blasenalgorithmus wird durch eine Doppelschichtschleife implementiert, bei der die äußere Schleife zur Steuerung der Anzahl der Sortierrunden verwendet wird. Im Allgemeinen wird die Länge des sortierten Arrays um eins reduziert, da nur noch ein Arrayelement in der letzten Schleife vorhanden ist und kein Vergleich erforderlich ist und das Array abgeschlossen wurde Aussortiert. Die innere Schleife wird hauptsächlich verwendet, um die Größe jedes benachbarten Elements im Array zu vergleichen, um zu bestimmen, ob Positionen getauscht werden sollen.

Code

#!/bin/bash
paixu() {
    
    
array=($1)
for ((i=1;i<${#array[*]};i++)) ##比较轮数为数组长度减1,从1开始
do
        for ((j=0;j<${#array[*]}-i;j++))  ##比较相邻两个元素,较大的数往后放,比较次数随比较比较轮数而减少
        do
        if [ ${array[$j]} -gt ${array[$[$j+1]]} ]  ##如果第一个元素比第二个元素大就互换
        then
        temp=${array[$j]}  ##把第一个元素值保存在临时变量中
        array[$j]=${array[$[$j+1]]}  ##把第二个元素值保存到第一个元素中
        array[$[$j+1]]=$temp  ##把临时变量(也就是第一个元素原值),保存到第二个元素中
        fi
        done
done
echo ${array[*]}
}
#主体代码
f=$(cat $1)
paixu $f

Die Ergebnisse sind wie folgt
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/cenjeal/article/details/108128512
Empfohlen
Rangfolge