先來說說,冒泡排序哪些地方需要優化: 根據上一篇文章的內容,可以知道冒泡排序的核心是兩兩對比進行交換。如果有一個無序序列(2,1,3,4,5,6,7,8,9,10) 按照上一篇文章的代碼,從第一次循環交換後的操作,可以說都是沒必要的。所以,這些操作就是我們需要優化的地方。 那麼如何優化? 通過觀察可以看到,造成沒必要的操作主要原因是後面8個數的順序都已經是有序。所以,我們可以通過設置一個標記變量,標記序列中的數是否在循環結束前就已經排好序 代碼: [cpp] #include <stdio.h> void swap(int *a, int *b); int main() { int array[10] = {2, 1, 3, 4, 5, 6, 7, 8, 9, 10}; int i, j; int flag = 1; //設置標記變量 for (i = 0; i < 10 && flag; i++) { flag = 0; //只要flag在下一次外循環條件檢測的時候值為0,就說明已經排好序,不用繼續循環 for (j = 9; j > i; j--) { if (array[j] < array[j-1]) { swap(&array[j], &array[j-1]); flag = 1; //如果有交換,就將標記變量賦1 } } } for (i = 0; i < 10; i++) { printf("%d\n", array[i]); } return 0; } void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } 根據優化過的代碼,當最好情況的時候,冒泡排序的時間復雜度是O(n