1.排序思想
氣泡排序也是非常簡單的排序演算法,易於理解。
要點:(1)也把陣列看作有序和無序部分,初始時將整個陣列視為無序;
(2)每次遍歷陣列中的無序部分,且兩兩比較,並將兩者中較大的元素置於後面一位,則一趟遍歷完成後,最大元素自然「沉到」無序部分的最後一位;
(3)減小無序部分的長度,迴圈第二步,直到陣列有序。
其思想與選擇排序類似,所不同的是每一趟通過兩兩比較與交換得到最大值,同時交換到最後位置。
2.**實現
//氣泡排序
void bubblesort(int arr, int len)
} }}
從**實現中可以看出外層迴圈中,len-i實際代表的是無序部分的最後乙個元素的位置,外層迴圈每執行一次就找到無序部分的最大值並同時被交換到len-i的位置上。這樣,無序部分元素減少乙個,而有序部分個數增加乙個。所以len-1趟之後,全部len個資料就拍好序了。
但是如果資料是有序的或者後半部分有序,氣泡排序的效率將非常低,它依然會一趟一趟不折不扣的執行比較,而造成效率低下。所以,可以針對這種情況對氣泡排序進行改進,那就是引入乙個空跑標誌(將一趟遍歷沒有發生資料交換稱之為空跑),用來代表該趟遍歷是否有資料交換,如果沒有,說明後面的資料已經有序(有序才不需要交換),則可以停止比較和交換了;如果有資料交換,則說明資料無序。
//氣泡排序的改進(引入空跑標誌)
void bubblesortimp(int arr, int len)
} i++;
}}
上述的改進演算法主要針對的是資料後半部分有序時候的改進,如果前半部分的資料有序,而後半部分無序又該如何改進呢?這個問題留給讀者思考,在文章的最後,我會給出參考鏈結。
3.效能分析
時間複雜度:o(n^2)。
由**可以看出,相對於選擇排序,它的資料移動次數明顯增多,而比較次數相同,所以根據選擇排序的效能分析,可以得知:無論最好情況、最壞情況和平均情況,比較次數都不變,所以選擇排序的時間複雜度o(n^2)。
空間複雜度:o(1)。
特點:穩定的就地排序(穩定性與**有關)。
適用性:小規模陣列排序。
總結:在某本演算法書中提到,氣泡排序的效率是非常糟糕的,如果不是因為它有乙個形象易記的名字,可能根本不會有人注意它。
氣泡排序及其改進
氣泡排序作為最經典的演算法,雖然對大資料無用武之地。但是對於少量的資料,我們用氣泡排序,在時間複雜度上也是可以接受的,又因為它實現起來比較簡單,所以也經常的被人們使用。並且可以通過一些方法來改進最原始的氣泡排序,這種改進演算法的思路也有可取之處。前一兩天參加宜搜科技的筆試,就考到了氣泡排序。我當時就...
氣泡排序及其改進
1 比較相鄰的元素,前者大就交換 2 每對相鄰元素都比較 3 對所有元素都重複以上步驟 最後乙個元素不用 這個程式是正確的,可以將乙個陣列公升序排列,但如果給的陣列已經是公升序排列 例如a 這個時候再執行len 1趟就會浪費時間,所以給出了如下改進 define crt secure no warn...
氣泡排序及其改進演算法
第乙個排序函式 sort1 為氣泡排序的典型實現,第二和第三個為改進後的排序函式 include include define len 20000 double sort1 int int double sort2 int int double sort3 int int int main int ...