實驗 shell 氣泡排序

2021-10-23 18:38:24 字數 1762 閱讀 9586

演算法原理:

氣泡排序的原理(以遞增序為例)是每次從頭開始依次比較相鄰的兩個元素,如果後面乙個元素比前乙個要大,說明順序不對,則將它們交換,本次迴圈完畢之後再次從頭開始掃瞄,直到某次掃瞄中沒有元素交換,說明每個元素都不比它後面的元素大,至此排序完成。

由於氣泡排序簡潔的特點,它通常被用來對於計算機程式設計入門的學生介紹演算法的概念。

時間複雜度:

若檔案的初始狀態是排好序的的,一趟掃瞄即可完成排序。所需的關鍵字比較次數c和記錄移動次數 m 均達到最小值(cmin = n-1、mmin = 0)

所以,氣泡排序最好的時間複雜度為o(n)。

若初始檔案是反序的,需要進行n趟排序。每趟排序要進行 c = n-1次關鍵字的比較(1≤i≤n-1)和總共(mmax = (n*(n-1))/2)次的移動(移動次數由亂序對的個數決定,即多少對元素順序不對,如 1 3 4 2 5 中共有(3,2)、(4,2)兩個亂序對),在這種情況下,比較和移動次數均達到最大值(cmax =n*(n-1) + mmax=(n*(n-1))/2 = o(n2))。所以,氣泡排序的最壞時間複雜度為o(n2)

綜上,氣泡排序總的平均時間複雜度為o(n^2)。

演算法穩定性:

氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。如果兩個相等的元素相鄰,那麼根據我們的演算法。它們之間沒有發生交換;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

演算法改進:

由於氣泡排序演算法還是比較慢的,所以有很多人對在此基礎上進行了改進,我只簡單介紹一下我所知道的。

第一種是上浮操作與下沉操作相結合。傳統的氣泡排序只有上浮操作,如果碰到一些很特殊的資料就會顯得笨一點,例如(2、3、4、5、1)這個數列按增序排列,那麼按照普通冒泡演算法就要掃瞄5趟,可是我們一眼就看出來直接把 1 挪到第乙個就行了,掃瞄 5 次實在是太笨了,於是我們在每次上浮操作後加上乙個下沉操作,這樣就更快了。

第二中改進是減少無效比較的次數。所謂無效比較就是當我們已知結果卻還要去比較。如果我們多觀察氣泡排序的中間過程,我們就會發現,末尾的一些元素在一定次數的掃瞄後已經到達最終位置了(因為每次掃瞄後都至少會有乙個新的元素到達最終位置),再比較就會造成無效比較。改進方法是,記錄下每次掃瞄中發生交換的最後乙個元素位置,下一次掃瞄就到這裡為止。

實驗案例:

#!/bin/bash

array=(3 2 5 1 4)

for ((i=1;i

do for ((j=0;j

doif [ $ -gt $ ];then ###如果第乙個元素比第二個元素大就互換

temp=$ ###把第乙個元素值儲存到臨時變數中

array[$j]=$ ###把第二個元素值儲存到第乙個元素中

array[$[$j+1]]=$temp ###把臨時變數(也就是第乙個元素原值)儲存到第二個元素中

fidone

done

echo $

實驗截圖:

Shell程式設計實驗之氣泡排序

氣泡排序 類似氣泡上湧的動作,會將資料在陣列中從小到大或者從大到小不斷的向前移動 氣泡排序的基本思想是對比相鄰的兩個元素值,如果滿足條件就交換元素值,把較小的元素移動到陣列前面,把大的元素移動到陣列後面 也就是交換兩個元素的位置 這樣較小的元素就像氣泡一樣從底部上公升到頂部。冒泡演算法由雙層迴圈實現...

Shell氣泡排序

通過對資料迴圈排序,得出數值大小,進行排序。bin bash 氣泡排序 score 10 511007060 for i 1 i i dofor j 0 j i j doif gt then temp 中間變數 score j score j 1 temp fidone done echo 此處 j...

Shell氣泡排序

類似氣泡上湧的動作,會將資料在陣列中從小到大或者從大到小不斷地向前移動。由雙層迴圈實現,其中外部迴圈用於控制排序輪數,一般為要排序的陣列長度減1次,因為最後一次迴圈只剩下乙個陣列元素,不需要對比的,同時陣列已經完成排序了,而內部迴圈主要用於對比陣列中每個相鄰元素的大小,以確定是否交換位置,對比和交換...