4.冒泡排序:
是一種簡單的穩定的交換排序,其排序過程為:對於相鄰的元素進行大小比較,如果滿足排序要求,則不進行交換,否則將兩個數進行交換。
如序列{30, 12, 52, 23, 15, 65, 31, 58, 20,63}:
以下是第一趟:30跟12比較,30>12交換位置,30<52,不交換位置,以此類推,將序列中最大的數放到最後位置,共執行n - 1次比較。共需要做 n - 1 次起泡。
最好時間複雜度:o(n);原因:若檔案是正序的時候,只需要一趟冒泡,n - 1次比較,移動次數為0就可以完成排序。因此最好的時間複雜度為o(n);
最壞時間複雜度:o(n^2);原因:若檔案是反序的時候,需要n - 1 趟冒泡,每趟比較 n - i 次關鍵字;比較的最大值為n*(n-1)/2=o(n^2),移動次數最大值為3n(n-1)/2=o(n^2)(註:需要交換的次數為n*(n-1)/2,而每次交換都需要有三條命令:temp = a;a = b;b = temp,這樣就要乘以3啦);所以最壞時間複雜度為o(n^2)。
5.快速排序:不穩定排序
例:{49.38.65.97.76.13.27}
首先以49為標準,將序列分為兩部分,左邊部分比49小..右邊部分比49大,這一步如:
圖來源於:http://www.bsgz.net/Article/Class20/Class88/sjjg/200609/936.html
最壞時間複雜度:o(n^2);原因:當每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,那麼必須做n - 1次劃分,第 i 次劃分開始時區間長度為 n - i +1,所需的比較次數為 n - i,故總的比較次數達到最大值 n*(n-1)/2=o(n^2),由於移動次數不大於比較次數,所以最壞時間複雜度為o(n^2)。
最好時間複雜度:o(nlog2n);原因:當每次劃分選取的基準都是中值時,可以用遞迴樹來解釋,樹的高度 d 與節點數 n 的關係是:
d^2-1 = n;所以遞迴樹高度 d = log2(n+1)=o(log2n) ,而每一層遞迴子節點中的時間複雜度為 o(n)(註:需要比較的總次數小於 n 次,移動次數比比較次數少);所以通過:每一層遞迴子節點中的時間複雜度*遞迴樹高度 求出總的時間複雜度:o(nlog2n)
6.歸併排序:穩定排序
將兩個或兩個以上的有序子表合并成一個新的有序表。
例:{72.28.51.17.96.62.87.33}
- {28.72}{17.51}{62.96}{33.87}
- {17.28.51.72}{33.62.87.96}
- {17.28.33.51.62.72.87.96}
最壞時間複雜度:o(nlog2n);
最好時間複雜度:o(nlog2n);都需要log2n趟二路並歸,每趟歸併的時間為o(n)所以時間複雜度都為o(nlog2n)。