基本排序演算法 之一 氣泡排序

2021-09-20 10:20:34 字數 1896 閱讀 2406

templatevoid bubblesort(t arr, int len)}}

}

未改進的氣泡排序,最好,最壞以及平均情況下的時間複雜度均為o(n^2)。

排序過程可能在k(k < n - 1)次外迴圈後已經達到有序狀態,但該演算法仍然會繼續比較相鄰元素,直到n - 1次外迴圈結束。基於以上考慮,提出改進的氣泡排序演算法a。

如果在k(k < n - 1)次內迴圈中沒有資料交換,即可認為該數列已經達到有序狀態。因此排序已經完成,可結束迴圈。

設定乙個標誌位,用來記錄數列是否達到有序狀態,若達到有序則結束迴圈。

templatevoid bubblesort(t arr, int len)}}

}

改進的氣泡排序a,最好的情況下時間複雜度均為o(n),最壞的情況下時間複雜度為o(n^2),平均時間複雜度為o(n^2)。

但是,排序過程可能在k(k < n - 1)次外迴圈後,數列的亂序元素僅限於(0,l)區間(l< n ),但是數列整體仍為無序的,每輪迴圈仍然進行(l,n)區間元素的比較操作。基於以上考慮,提出改進的氣泡排序演算法b。

每次迴圈都保持更新最右端逆序對位置為最近一次元素交換的位置,若在k(k < n - 1)次外迴圈後,數列的亂序元素僅限於(0,l)區間(l< n ),則在內迴圈中,從元素l開始,不會再進行交換操作,即最右端逆序對位置在 l 後不會再改變,內迴圈結束後記錄下位置 l,後續排列中將不再考慮 l 右邊的元素,即待排序數列縮短為範圍(0,l)。

templatevoid bubblesort(t arr, int len)

}last = high; //記錄最右端逆序對位置

}}

改進的氣泡排序b,最好的情況下時間複雜度均為o(n),最壞的情況下時間複雜度為o(n^2),平均時間複雜度為o(n^2)。

在亂序元素僅限於a[0, l)區間時,僅需一趟掃瞄交換,即可將問題範圍縮減至這一區間。累計耗時:o(n + l^2) = o(l^2)。

同理,排序過程可能在k(k < n - 1)次外迴圈後,數列的亂序元素僅限於[l,n)區間(l< n ),但是數列整體仍為無序的,每輪迴圈仍然進行[0,l)區間元素的比較操作。基於以上考慮,可以基於演算法b修改,使掃瞄過程從尾部開始,向左邊記錄最左端逆序對位置即可。

基於以上總結,演算法b可進一步拓展為排序過程可能在k(k < n - 1)次外迴圈後,亂序元素僅限於(l,m)區間(0 ≤ l < m ≤ n)的情形,結合演算法b及其修改,提出改進的氣泡排序演算法c。

每次迴圈雙向掃瞄,並保持更新最右端逆序對和最左端逆序對位置為最近一次元素交換的位置,若在k(k < n - 1)次外迴圈後,數列的亂序元素僅限於(l,m)區間(0 ≤ l < m ≤ n),則在內迴圈中,向左從l開始,向右從m開始,不會再進行元素交換。即最右端逆序對位置記錄為m,最左端逆序對位置記錄為l,後續排列將僅僅考慮(l,m)區間元素。

templatevoid bubblesort(t arr, int len)

}last = high; //記錄last 放在左向掃瞄前面,右端有序的子數列不再進行左向掃瞄!

//向左掃瞄

for(int j = last; j > first; j--)

}first = low;

}}

改進的氣泡排序c,最好的情況下時間複雜度均為o(n),最壞的情況下時間複雜度為o(n^2),平均時間複雜度為o(n^2)。

在亂序元素僅限於a(l, m)區間時,僅需兩趟掃瞄交換,即可將問題範圍縮減至這一區間。累計耗時:o(n + m + (m-l)^2) = o((m-l)^2)。

氣泡排序法的改進僅僅是該演算法的內部改進,無論怎麼改進,平均情況下的時間複雜度均為o(n^2),效率並沒有從根本上提公升。但是改進使得數列排序在某些情形下減少多餘操作,從而減少耗時。

演算法 排序之一 氣泡排序

如果資料按照一定的順序進行排序,資料處理的效率將顯著的提高。演算法是程式設計的精髓,乙個高效 而合適的演算法能極大的減少時間消耗與空間消耗,提到 合適 是因為沒有哪個演算法可以在所有情況下都表現出色,同樣是排序,在不同資料規模下各種排序演算法有不同的效能表現,選擇合適的解決演算法的才能最大限度地提高...

排序演算法之一 氣泡排序 C 版本

1.初始版本void bubblesort init int pdata,int size 每一輪結束之後,如果這輪中沒有進行一次資料交換,表明陣列已經有序,無需再進行操作。2.改進版本void bubblesort advance int pdata,int size if hasswap bre...

Python中的基本演算法之一,氣泡排序

下面是使用python來實現氣泡排序的演算法,氣泡排序是基本演算法之一,也是我們在面試過程中經常遇到的乙個面試題,來考驗我們基本的 編寫能力,下面我們就用 的實現這個需求。1 首先我們要思考的是如可將乙個順序混亂的列表,按照降序或者是公升序進行排列,其實就是進行比較,把數值大的排到後邊,把數值小的排...