氣泡排序和插入排序傻傻分不清

2021-10-14 15:23:15 字數 1736 閱讀 4388

氣泡排序和插入排序的時間複雜度相同,容易搞混淆。

氣泡排序最壞情況時間複雜度o(n^2), 最好情況時間複雜度o(n)。

插入排序最壞情況時間複雜度也是o(n^2), 最好情況時間複雜度也是o(n)。

氣泡排序和插入排序都是穩定的,穩定是指如果兩個數相等,排序過後它們的前後順序不變。如a=b, 排序前a在b的前面,排序後a仍然在b的前面。葉大蟲39:排序的穩定性

首先是氣泡排序:

#include int main() ;

int a[10] = ;

//氣泡排序

int num = 0;

for (int i = 0; i < 9; i++)

} }for (int i = 0; i < 10; i++) std::cout輸出

為什麼說氣泡排序最好的情況時間複雜度是o(n)呢,是因為上面的**還可以優化。當a[10] = 時會有不必要的數值比較,然而卻沒有交換發生,即序列已經有序,此時上述**就可以優化為:

#include int main() ;

int a[10] = ;

//氣泡排序

int num = 0;

for (int i = 0; i < 9; i++)

} if (0 == flag) break;

} for (int i = 0; i < 10; i++) std::cout

int a[10] = ;

//插入排序

int num = 0;

for (int i = 1; i < 10; i++)

} for (int i = 0; i < 10; i++) std::cout很明顯,插入排序在有序的情況下複雜度為o(n),程式輸出為:

總結:氣泡排序(從小到大)的思想就是比較相鄰的元素,如果前乙個元素大於後乙個元素,則交換這兩個元素,然後繼續比較和交換。而插入排序(從小到大)則和氣泡排序相反,插入排序是將當前位置的數和它之前的數進行比較,如果該數小於它前面的數,則交換位置,繼續向前比較。直觀上看,氣泡排序(從小到大)是將較大值往後移動,插入排序(從小到大)是將較小值往前移動,兩者起到的效果一樣。

2021/5/18

補充:插入排序的核心是序列已經有序,即當前要排序的數為ai,則要求[a0,…,ai-1]是已經排好序的。

因此,在進行插入排序時必須從第2個數往前比較,然後是第三個數。

那麼試想一下如果我們在一開始比較時從最後乙個數an開始比較,然後從an-1開始往前比較會發生什麼呢。(以公升序排列為例)

答案是不滿足部分序列已經有序。

設a=[10, 9, 8, 7, 3, 2, 1, 6, 5, 4]

比較4:a= [10, 9, 8, 7, 3, 2, 1, 4, 6, 5] // 其實到這裡就可以看出問題了

比較6:a= [10, 9, 8, 7, 3, 2, 1, 4, 6, 5]

比較4:a= [10, 9, 8, 7, 3, 2, 1, 4, 6, 5]

比較1:a= a=[1, 10, 9, 8, 7, 3, 2, 4, 6, 5]

…所以看出插入排序的基礎是當前要排序的元素前面已經有序

氣泡排序,插入排序

前提 void x sort elementtype a,int n 大多數情況下,為簡單起見,討論從小大的整數排序 n是正整數 只討論基於比較的排序 有定義 只討論內部排序 穩定性 任意兩個相等的資料,排序前後的相對位置不發生改變 沒有一種排序是任何情況下 都表現最好的 氣泡排序 void bub...

氣泡排序 插入排序

學習思路 思路講解 實現 1 通過雙重迴圈,相鄰兩個資料做對比,通過位置交換使其變得有序 2 時間複雜度 分析 解釋 外部迴圈從0開始i 內部迴圈從0開始j,完整迴圈後會將本次最大值放入陣列最後,下次迴圈可忽略相應的尾部資料 length i 1 重複1 2步即可完成排序 實現 public cla...

氣泡排序 選擇排序和插入排序

氣泡排序 思路 將相鄰的兩個數比較,將較小的數調到前頭 有n個數就要進行n 1趟比較,第一次比較中要進行n 1次兩兩比較,在第j趟比較中,要進行n j次兩兩比較。依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放...