在每一輪迴圈中,依次比較相鄰的元素。如果是 從大到小排序,則每次將兩個元素中較大的乙個元素往後交換;如果是從小到大排序,則每次將兩個元素中較小的乙個元素往前交換。時間複雜度o(n^2),空間複雜度o(1)根據原始版本的排序過程,觀察圖2 的示意圖。可以發現:當 i = 7時,已經得出結果,i = 8 的迴圈過程就不用進行。(這個給的資料不是很好,比如在 i = 3時,資料就已經有序了,那麼接下來的幾次外部迴圈就不用進行了,那麼我們考慮如果出現這樣的情況下,怎麼去優化 操作的次數)設定乙個變數 flag = true。
如果在某乙個迴圈中,如果相鄰的兩個數之間發生交換,那麼flag = false。
如果,乙個迴圈後,所有相鄰的資料之間都沒有發生變化,那麼flag = true 不變。此時就跳出迴圈。
這裡,首先理解一下有序區間的概念:陣列有序的區域。比如array[4,5,3,6,2,1,7,8,9],則[7,8,9]可以認為是有序的區域。當存在有序區間時,那麼在每乙個迴圈中就不必對有序區間進行判斷是否需要交換操作了。#include #include #include #include using namespace std;int main()
int lastindex = 0;
int border = a.size()-1;
for(int i=0; ia[j+1])
}border = lastindex;
if(flag)
break;
}for(int i=0; i程式中使用兩個變數,
border:表示無需區域的邊界,即為每一輪迴圈的比較次數的設定界限。
lastindex:記錄每一輪迴圈中,元素交換的下標值。
上圖中,當i= 6時,就不用再進行資料之間的比較了。減少了比較操作的次數。是氣泡排序的變形,一輪從左到右排序,下一輪則從右向左排序。如有錯誤,還請指正。氣泡排序及優化
氣泡排序的基本思路是 每次將相鄰兩個數比較,將小的調到前頭 本例按照從小到大排序 按此規律如果有n個數,則要進行n 1趟比較。在第1趟比較中要進行n 1次兩兩比較,在第 j 趟比較中要進行 n j 次兩兩比較。實現如下 include define n 10 int main for i 0 i n...
氣泡排序及優化
只考慮演算法的實現 public static void version1 int array 如果陣列的某一部分本身就是有序的,能顯著減少迴圈的趟數 public static void version2 int array if flag break 分析 我們假設在進行某趟排序時已經有序了,以...
氣泡排序及優化
目錄 一 思路 二 普通寫法 三 模板寫法 四 優化一 五 優化二 六 優化三 氣泡排序 無序區,有序區 從無序區通過交換找出最大元素放到有序區前端。1 比較相鄰元素,如果第乙個比第二個大,交換他們。2 對每一對相鄰元素做同樣操作,從開始第一對倒最後一對。這步做完後,最後的元素是最大的。3 針對所有...