嗯嗯,這是本人第二次更新部落格~~距離第一次已經好久好久啦~~這一系列的部落格是本人早就想要寫的,不過內容太多又恐不慎之處會誤人子弟...遂醞釀了很長一段時間,
終於在最近將這篇部落格完成了.當然,由於本人的知識和技術實在有限,所以文章中不可避免的會有些錯誤,希望各位看官能不吝批評指出.
文章中的解析等都是上課老師所用,出處不明...拜謝老師的精美ppt.
ok,讓我們開始對內部排序問題的**吧~~
首先,讓我們對各種排序進行一下分類.
最直接的方式當然是按照
時間複雜度來劃分:
簡單排序:時間複雜度為o(n²);
先進排序:時間複雜度為o(nlogn);
基數排序:時間複雜度為o(d.n);
以下的介紹主要按照各種排序之間的聯絡來展開.這次是插入排序和shell排序.
插入排序:
插入排序是一種想法非常直接,簡單的方法.他的思路如下:
1.從第乙個元素開始,該元素可以認為已經被排序
2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄
3.如果該元素(已排序)大於新元素,將該元素移到下一位置
4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
5.將新元素插入到該位置中
6.重複步驟2
實現的**如下:
void insort(int a,int sz)
//swap函式作用是交換值.
明顯的,這種方法的時間複雜度是0(n²),也就是乙個簡單排序.
當然,還可以略微的有所改進,即利用乙個中間變數,將連續的兩兩交換變成比較後的直接賦值.
實現的**如下:
void insort(int a,int sz)
}
ps.在向前搜尋位置的時候,也可以稍稍加以改善.可以利用
折半查詢的思路來進行,這樣也將減小排序過程中的時間複雜度. 篇幅原因就不再給出 **了.
當然,這兩種改進並不能從數量級上改善演算法時間複雜度.~~~~~~~~~
值得注意的是,插入排序的方法是非常適合於小規模資料的排序,或者是資料已經
基本有序的情況.在這兩種情況下,插入排序的效率是非常高的.
隨後要介紹的shell 排序就是在這兩點的前提下,通過對插入排序的方法進行改進後所得到的.
shell排序:
希爾排序的思想實質上是就是插入排序.
他的改善之處是通過將比較的全部元素分為幾個區域來提公升插入排序的效能。在分割槽之後,每個區段上的
資料量是很少的,這種情況下的插入排序是非常高效的.(這裡的分割槽是指間隔分割槽,如下圖)
採用間隔分割槽後的插入可以讓乙個元素可以一次性地朝最終位置前進一大步(在下面的圖示中會有明顯體現,請細心觀察)。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。
演算法實現過程的示意圖如下:
下面給出shell排序的實現**:
///
voidinsort2(int a,int sz,int d) //d為劃分區間的間隔
void shell(int a,int sz)
/// .
shell演算法的時間複雜度很複雜,難以列式計算出來..shell演算法所進行的比較和交換次數大概為n 的1.3次方.在資料量很大的情況下,是遠遠比插排高效的.當n趨於無窮時可減少到n(log2 n)².
影響shell演算法效率的乙個重要因素,就是對分割槽間隔的選取後續的文章也會在近期更新了.
內部排序之插入排序
1.插入排序 插入排序可以視為兩步操作,一步是插入,一步是排序。插入排序的基本思想是將一條記錄插入到已經有序的序列中,繼而得到乙個有序的,資料個數加一的新序列。2.直接插入排序 直接插入排序把待排序序列視為兩部分 一部分是有序序列,通常在排序開始之時將序列中的第乙個資料視為有序序列 另一部分為待排序...
內部排序之插入排序 希爾排序
插入排序 insertion sort 插入排序由n 1趟 pass 排序組成,對於p 1趟到p n 1趟,插入排序可以保證從位置零到位置p上的元素全部有序,有這樣乙個事實 1 當插入p位置 設為data 的時候,從0位置到p 1已全部有序,如果data比p 1位置上的元素大,那麼直接放在p位置即可...
排序系列 插入排序
排序 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。穩定性 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r i r j 且r i 在r j 之前,而在排序後的序列中,r i 仍在r j 之前...