排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。
內部排序:資料元素全部放在記憶體中的排序。
外部排序:資料元素太多不能同時放在記憶體中,根據排序過程的要求不能在內外存之間移動資料的排序。
眾所周知,排序演算法在現實生活中得到了非常多的應用。在資料結構中排序主要分為四個部分:
插入排序,選擇排序,交換排序,歸併排序這四種。在這篇部落格中來介紹一下插入排序:
直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列 。
實際中我們玩撲克牌時,就用了插入排序的思想。
當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與
array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序後移。
直接插入排序的特性總結:
元素集合越接近有序,直接插入排序演算法的時間效率越高
時間複雜度:o(n^2)
空間複雜度:o(1),它是一種穩定的排序演算法
穩定性:穩定
圖示:
**的基本實現:
void
insertsort
(int
* a,
int n)
a[end +1]
= tmp;}}
void
testinsertsort()
;insertsort
(a,sizeof
(a)/
sizeof
(int))
;printarray
(a,sizeof
(a)/
sizeof
(int))
;}
希爾排序( 縮小增量排序 )希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。
希爾排序的特性總結:
希爾排序是對直接插入排序的優化。
當gap > 1時都是預排序,目的是讓陣列更接近於有序。當gap == 1時,陣列已經接近有序的了,這樣就
會很快。這樣整體而言,可以達到優化的效果。我們實現後可以進行效能測試的對比。
希爾排序的時間複雜度不好計算,需要進行推導,推導出來平均時間複雜度: o(n1.3—n2)
穩定性:不穩定
圖示:
希爾排序的**實現:
void
shellsort
(int
* a,
int n)
a[end + gap]
= tmp;}}
}
這篇部落格主要先簡單介紹一下插入排序,接下來會介紹其他的排序。 C 排序系列(一) 插入排序之折半插入排序
鄭重宣告 本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!折半插入排序 binary insertion sort 是對插入排序演算法的一種改進,由於排序演算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查詢的方法...
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...