Sorting大體共分五類:
1、插入排序
2、交換排序
3、選擇排序
4、歸併排序
5、計數排序
本文介紹插入排序:
一、直接插入排序(Straight Insertion Sort)
需要一個監視哨,一般設在0位置處。
大意:
先把第i個位置的元素放入監視哨(i從2開始,i<=N),如果第i個比第i-1個數小,
那麼 第i-1個數賦值給第i個,並且從i-2開始,直到r[0](待排序的數字在監視哨內)大於r[j]位置,所有數字後移
L.r[j+1] = L.r[0]
適用範圍:n比較小
空間需要:一個監視哨
時間複雜度:O(n^2) 後面介紹的插入排序時間複雜度都相同
二、折半插入排序(Binary Insertion Sort):
與折半查找類似,折半查找所需要插入的點,後從該點開始,全部後移。
需要設置low與high指針。
三、2-路插入排序
設置first指針與final指針,分別把兩個數放在開始和結尾。final放在前面,first放在後面。
如果比r[0]數大的就把他放在前面重新排列,final指針移動。
如果比r[0]小的就把他加入到後面與first組合起來重新排列。
最後first指向最小的數,final指向最大的數。first到數組盡頭後從r[0]繼續數。
移動次數約爲n^2/8,減少了移動記錄的次數,但扔不可避免地移動記錄。
四、表插入排序
初始化,把r[1]與r[0]設置爲循環鏈表內的元素,其中r[0]爲MAXINT,在列表中始終佔有最大的位置。逐步插入到鏈表中應該插入的位置。
優點:不再需要移動元素。
缺點:查找比較麻煩,不能隨機查找,可以把所有元素重新寫入數組中。
五、希爾排序(Shell's Sort)
注:在時間複雜度上不同於其他插入排序。
希爾排序沒有簡單地分隔子序列,而是採用增量的方式組成子序列。
如:10個元素:
第一趟排序分成五個子序列:1,6 / 2,7 / 3,8 / 4,9 / 5,10
第二趟排序分成三個子序列:1,4 ,7,10 / 2,5,8 / 3,6,9
第三趟完成全部排序。
爲什麼快了,是尚未解決的數學難題。增量的取法不同,時間複雜度也不同,感興趣可以深入研究一下。比較次數和移動次數大約爲n^1.3。
當增量序列爲dlta[k]=2^(t-k+1) - 1時,其中t爲趟數,時間複雜度O(n^(3/2))