演算法過程:
假設乙個無序的序列,該演算法將其分成兩部分,前一部分已經完成排序(有序,一開始時只有乙個元素),後一部分任然無序,將後面序列選擇第乙個插入到前面的有序序列,如此直到所有完全有序。
複雜度:
最簡單的即為,整個序列原來即有序,按照一種最「省事」的方式,我們僅需比較n-1次即可。
最複雜的情況,應該說是某種情況操作最多的情況,我們在每次插入時需要比較n-1次,整個排序過程需要比較n*(n-1)/2次,插入n-1次。
按照複雜度計算方法為o(n2次方)
穩定性:
具體的演算法還是有點差別的,例如是正序和反序,比較的方向,對於用於比較的關鍵字相等時候的處理等,但是總能找到一種方法使得整個演算法是穩定的,所以該演算法是穩定的。
演算法關鍵字:增量
why插入:將後面元素插入到前面有序列。
演算法過程:
將相鄰對元素比較,矯正順序,直到最後,最值留在後面,以此類推。
穩定性:
由於只有相鄰才交換,且相等時不交換,所以是具有穩定性。
why冒泡:想氣泡一樣乙個元素乙個元素的公升上來。
初始關鍵字 [49 38 65 97 76 13 27 49]
第一趟排序後 13 [38 65 97 76 49 27 49]
第二趟排序後 13 27 [65 97 76 49 38 49]
第三趟排序後 13 27 38 [97 76 49 65 49]
第四趟排序後 13 27 38 49 [76 97 65 49 ]
第五趟排序後 13 27 38 49 49 [97 65 76]
第六趟排序後 13 27 38 49 49 65 [97 76]
第七趟排序後 13 27 38 49 49 65 76 [97]
最後排序結果 13 27 38 49 49 65 76 97
演算法過程:
如上,每次從待排序序列選擇最值與待排序序列的第乙個值進行交換(破壞穩定性),直到完成。
演算法複雜度:
顯然n-1,n-2,,,2,1,全部共有n*(n-1)/2次比較,所以複雜度為n2次方。
穩定性:
該方法之所以用交換應該是考慮空間大小的因素,但是這樣也導致穩定性遭到破壞,實際可以進行插入的方法這樣可以保證穩定性,但是這樣和插入排序沒什麼區別了。
why選擇:選擇無序列的最值和本身進行交換
演算法過程:
先將兩個無序列分別用歸併排序方法排序,將已排序的序列合併成乙個序列。遞迴,分治。
複雜度:
在分割的過程,複雜度為logn,歸併過程為n,總的時間複雜度為nlogn。
穩定性:
具有穩定性,假設關鍵字相等元素在兩個不同的序列,在合併過程中相等時不更改其相對位置即可。
今天看到了基數排序,很簡單有意思,如下原始資料:
11 54 23 87 36 82 44
首先按照個位數排序,如下:
11 82 23 54 44 36 87,注意這個演算法需要保持穩定性,再對十位數排序,如下:
11 23 36 44 54 82 87,排完啦,顯然此處基數為10,轉成8進製時,基礎可以為8,
還能應用在哪呢 。思考
快速排序
1.首先選擇乙個key作為中間數字,將整個序列分成兩個無序序列(乙個比他都大,乙個比他都小)(從左到右走一遍 on的複雜度);
2.將這兩個無序序列排序(遞迴,分治);
3.合併之。
所以,演算法複雜度就是nlgn,而且在第一步中會導致該排序演算法不穩定。
排序演算法小結
1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...
排序演算法小結
1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...
排序演算法小結
經典的排序演算法有十種,分別是 選擇排序 插入排序 希爾排序 氣泡排序 堆排序 合併排序 快速排序 計數排序 基數排序和桶排序。下面對這些演算法分類如下 選擇排序 簡單選擇排序 堆排序 插入排序 直接插入排序 二分插入排序 希爾排序 快速排序 快速排序 隨機化快速排序 線性時間排序 計數排序 基數排...