氣泡排序 怎麼計算時間複雜度

2021-09-06 14:43:23 字數 1796 閱讀 6542

時間複雜度為o(n^2)

每次比較兩個相鄰元素,如果他們的順序錯誤就把它們交換過來。

例如我們需要將 12,35,99,18,76,  5個數進行從大到小排序,既然是從大到小排序,也就是越小越靠後。

首先比較第乙個數和第二個數,第乙個是12,第二個是35,發現12 小於35,由於是越小越靠後,因此要對這兩個數交換位置,那麼交換後的順序為 35,12,99,18,76。按照之前的方法,我們比較第二個和第三個數,第二個是12第三個是99,99大於12,所以要交換兩個數的位置,交換過的順序為 35,99,12,18,76。以此類推,可以通過下圖來看12的位置變化:

12,35,99,18,76   初始資料

35,12,99,18,76   第1次交換

35,99,12,18,76   第2次交換

35,99,18,12,76   第3次交換

35,99,18,76,12   第4次交換 (5-1,假設要排序的個數為m,那麼比較次數m-1,那麼最糟糕情況下互動次數就是m-1)

進行4次交換後,就成功把最小的數12給排到最後面了。

現在我們已經將最小的數給歸位了,現在對剩下的數再進行歸位,細節我就不講了,就將下重要的。

對剩下4個數進行排序:

99,18,76,35,12 (交換了3次,比較次數3)

對剩下3個數進行排序:

99,76,18,35,12  (比較了1次【99,76】,交換了1次【18,76】,比較次數2)

對剩下2個數進行排序:

99,76,18,35,12 (交換了0次,比較1次)

就如同乙個氣泡,一步步向上翻滾,最後成功浮出水面,所以他叫氣泡排序。

//生成資料來源

//待排序個數

int n=5;

int src=new int[n];

src[0]=12;

src[1]=35;

src[2]=99;

src[3]=18;

src[4]=76;

//氣泡排序

//遍歷第乙個到最後乙個

for (int i=0; i計算最糟糕情況

要排序的個數n

第一層for

執行了n次

第二層for

第一次比較了n-1次

第二次比較了n-2次

第n-1次比較了1次

執行的總次數

count=3(1+2+3+4+.....+n-1)(n為正整數)

列印for

執行了n次

所有總的次數:

sum=n+3(1+2+3+4+...+n-1)+n+(n-n)=3(1+2+3+4+...+n-1+n)-n

如果n為偶數

sum=3* n/2*(n+1) -n=3/2(n^2+n)-n=1/2(3n^2+n)

如果n為奇數

sum=3((n-1)/2 *n+(n+1)/2)-n=3/2(n^2+1)-n=1/2(3n^2-2n+3)

所以最差的情況的時間複雜度為o(n^2),最好的情況我就不推了,o(n)

氣泡排序的時間複雜度

氣泡排序是一種用時間換空間的排序方法,最壞情況是把順序的排列變成逆序,或者把逆序的數列變成順序。在這種情況下,每一次比較都需要進行交換運算。舉個例子來說,乙個數列 5 4 3 2 1 進行冒泡公升序排列,第一次大迴圈從第乙個數 5 開始到倒數第二個數 2 結束,比較過程 先比較5和4,4比5小,交換...

氣泡排序 時間複雜度與空間複雜度

外迴圈是遍歷每個元素,每次都放置好乙個元素 內迴圈是比較相鄰的兩個元素,把大的元素交換到後面 等到第一步中迴圈好了以後也就說明全部元素排序好了 實現 include 列印陣列元素 void print array int array,int length printf n n void bubble...

時間複雜度計算

定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只是說有上界,由定義如...