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

2021-09-26 01:47:55 字數 1504 閱讀 1757

外迴圈是遍歷每個元素,每次都放置好乙個元素;   

內迴圈是比較相鄰的兩個元素,把大的元素交換到後面;

等到第一步中迴圈好了以後也就說明全部元素排序好了;

**實現:

#include//列印陣列元素

void print_array(int *array, int length)

printf("\n\n"); } 

void bubblesort(int array, int length)

}   

}    } 

int main(void)

;     print_array(array, 12);

bubblesort(array, 12);

print_array(array, 12);

return 0;

}

這個時間複雜度還是很好計算的:外迴圈和內迴圈以及判斷和交換元素的時間開銷;

最優的情況也就是開始就已經排序好序了,那麼就可以不用交換元素了,則時間花銷為:[ n(n-1) ] /  2;所以最優的情況時間複雜度為:o( n^2 );

最差的情況也就是開始的時候元素是逆序的,那麼每一次排序都要交換兩個元素,則時間花銷為:[ 3n(n-1) ] / 2;(其中比上面最優的情況所花的時間就是在於交換元素的三個步驟);所以最差的情況下時間複雜度為:o( n^2 );

綜上所述:

空間複雜度就是在交換元素時那個臨時變數所佔的記憶體空間;

最優的空間複雜度就是開始元素順序已經排好了,則空間複雜度為:0;

最差的空間複雜度就是開始元素逆序排序了,則空間複雜度為:o(n);

平均的空間複雜度為:o(1);

最優時間複雜度 n

有很多人說氣泡排序的最優的時間複雜度為:o(n);其實這是在**中使用乙個標誌位來判斷是否已經排序好的,修改下上面的排序**:

void bubblesort(int array, int length)

}   

if (flag) break;

}   

}

根據上面的**可以看出,如果元素已經排序好,那麼迴圈一次就直接退出。或者說元素開始就已經大概有序了,那麼這種方法就可以很好減少排序的次數;其實我感覺這種方法也有弊端,比如 要額外的判斷下,以及賦值操作;

有人會說這個空間複雜度能降到0,因為空間複雜度主要是看使用的輔助記憶體,如果沒有輔助記憶體變數,那麼可以說空間複雜度為0;所以該演算法中空間複雜度一般是看交換元素時所使用的輔助空間;

1、 a  = a + b; b = a - b; a = a - b;

2、 a = a * b;   b =  a / b; a = a / b;

3、 a = a ^ b;  b =  a ^ b;a = a ^ b; 

上面幾種方法都可以不使用臨時空間來交換兩個元素,但是都有些潛在的問題,比如 越界;所以個人覺得還是老老實實的用個臨時變數吧,這樣演算法意圖就比較清晰了。

時間複雜度與空間複雜度

空間複雜度 space complexity 是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s n o f n 比如直接 插入排序 的時間複雜度 是o n 2 空間複雜度是o 1 而一般的 遞迴演算法就要有o n 的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法...

時間複雜度與空間複雜度

本文是對時間複雜度以及空間複雜度的乙個理解 時間複雜度 由於環境的不同,同樣的 執行所需要的時間是不同的,所以是不能拿來比較的 而函式中執行的次數確實一樣的 所以時間複雜度就是 程式每個迴圈中的語句總共會執行的次數 時間複雜度的表示方法 大o漸進表示法 o f n 這裡的f n 是什麼呢?void ...

時間複雜度與空間複雜度

本文部分取自搜狗百科 在求演算法效率時,通常有事前分析和事後分析兩種方法,事後分析因為必須實際檢驗過後才能得出答案,且可能由於硬體方面等外部原因影響結果而不被推廣,事前分析的主要就是在考量乙個演算法的基本執行次數,這就是時間複雜度。時間複雜度 一般情況下,演算法中基本操作重複執行的次數是問題規模n的...