三、**實現
四、總結
五、參考源
本文所有演算法均以c++實現
o(n2)
in-place
穩定類似於金魚冒泡的物理現象。金魚吐出的氣泡(待排元素)
受到 上浮過程中(每次冒泡迴圈)
的 水壓(公升序/降序)
影響而逐漸變大,冒出水面時氣泡大小最大公升序一次迴圈後最大元素排在最後
具體來說:
每次冒泡迴圈中:相鄰的元素兩兩比較
,
當乙個元素大於
右側相鄰元素時,交換它們的位置
;
當乙個元素小於或等於
右側相鄰元素時,位置不變
。
此時,最大的數字9就排到了隊尾,此時稱為一次冒泡。
重複冒泡過程
,進行(n -1)
次冒泡,序列必然有序
。
因為每一次冒泡過程
將遍歷所有的n個元素,且將進行n-1
次冒泡過程
,所以:
平均時間複雜度:o(n2)
最好情況:o(n)
最壞情況:o(n2)
因為僅僅進行了交換,所以:
空間複雜度o(1)
template
<
typename
t>
void
bubblesort
(vector
&nums)
//公升序
}//每一次冒泡的最大值最後一定放在length - 1 - i的位置
}//冒泡過程
}
情景:氣泡排序中時常會遇到未進行完n-1
次排序,序列已經有序,但演算法依然繼續執行,浪費了大量的時間。
解決方案:當某次冒泡過程中沒有進行交換時,就說明序列已有序
**實現:
template
<
typename
t>
void
bubblesort
(vector
&nums)
//公升序
}//每一次冒泡的最大值最後一定放在length - 1 - i的位置
if(done)
return
;//排序完成,提前結束
}//冒泡過程
}
情景:序列中本身具有部分有序的片段,但演算法依舊掃瞄過去,造成大量時間浪費。例如:[8, 0, 7,3, 4, 5, 6
, 1, 2, 9], 其中3,4,5,6已經處於正確位置無需再遍歷。
解決方案:標記最後一次進行交換的位置,該位置之後均為有序
**實現:
template
<
typename
t>
void
bubblesort
(vector
&nums)
//公升序
}//每一次冒泡的最大值最後一定放在length - 1 - i的位置
if(done)
return
;//排序完成,提前結束
border = lastexchange;
//更新邊界
}//冒泡過程
}
解決方案:按正向、逆向交替的冒泡方式進行雙向冒泡
**實現:
template
<
typename
t>
void
doublebubblesort
(vector
&nums)
//使正序列公升序
}//奇數輪,左到右
for(
int j = length -
1- i; j > i;
--j)
//使正序列公升序
}//偶數輪,右到左
}//冒泡過程
}
情景:在一般的氣泡排序中可以優化使得演算法及時結束,跳過無需考慮的部分。這些優化措施在雞尾酒排序中也有相當的優化作用。
解決方案:將上述優化"提前結束演算法"和"跳過有序區"整合入雞尾酒排序中
**實現:
template
<
typename
t>
void
doublebubblesort
(vector
&nums)
//使正序列公升序
}//奇數輪,左到右
if(done)
return
;//排序完成,提前結束
border = lastexchange;
//更新邊界
done =
true
;//重置標記
for(
int j = border; j > i;
--j)
//使正序列公升序
}//偶數輪,右到左
if(done)
return
;//排序完成,提前結束
border = lastexchange;
//更新邊界
}//冒泡過程
}
氣泡排序是最為簡單的一種排序,其實用性低
,但邏輯簡單
、易快速構造
。處理較少
的資料量時,可以考慮使用。
雙向氣泡排序(雞尾酒排序),是基於氣泡排序的變種版本。再附加上優化改進,雖然在使其有更高的效率、相容性,但其平均時間複雜度依舊為o(n2)
演算法視覺化:
演算法優化:
感謝閱讀!
Java 實現氣泡排序及優化
氣泡排序就是按索引逐次比較相鄰的兩個元素,滿足比較條件,則置換,否則不做改變。其優化手段可以從減少記憶體迴圈和外層迴圈著手。最差的冒泡 public void sort1 int ary system.out.println total time system.nanotime starttime ...
氣泡排序 python實現及優化
氣泡排序原理 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個 否則,位置不變。2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。最後的元素應該會是最大的數。3.針對所有的元素重複以上的步驟,除了最後乙個。4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較...
氣泡排序及優化
氣泡排序的基本思路是 每次將相鄰兩個數比較,將小的調到前頭 本例按照從小到大排序 按此規律如果有n個數,則要進行n 1趟比較。在第1趟比較中要進行n 1次兩兩比較,在第 j 趟比較中要進行 n j 次兩兩比較。實現如下 include define n 10 int main for i 0 i n...