排序 插入排序 直接插入排序 希爾排序

2021-08-04 09:19:16 字數 1383 閱讀 9226

部落格的全部**以及測試用例全部已上傳github:直接插入排序&&希爾排序

直接排序其實就是一次將無序空間向有序空間轉換的過程,其實所有排序都是這樣,只不過,在直接排序中,我們是將原本的資料內容分為了前後兩個空間,前面的乙個空間是有序的,而後面的空間無序,我要做的就是慢慢的將有序空間增長,將無序空間縮小,直到無序空間為0,我們就可以得到乙個有序的資料鏈;

在上圖中,我們大致可以觀察出這套演算法所執行的過程:

在原始陣列中,預設第乙個數字是有序的,其他後面的數字全部無序;

在無序的數字中,從前向後開始,取第乙個數字與有序區域的數字從後向前比較;

如果有序中的數字大於該數字,就將大於的數字向後移一位;

直到遇到乙個小於或者等於它的數字,就講該數字插入到當前位置;

直到全部有序,否則就重複2-4的步驟;

//version1 時間複雜度o(n^2)

void insertsort(int *array, size_t size)

array[end + 1] = key;}}

我們可以看到,在上面的**中,確實比較簡單,到那時事件複雜度達到了o(n^2);其實,我們可以在這個**中找到一些,我們原來學習到的東西,替換它,比如在有序空間中找數字時,可以用到二分查詢;

//version2 時間複雜度降低,利用二分查詢來找位置

void insertsort_op(int *array, size_t size)

while (end >= left)

array[end + 1] = key;}}

從根本意義上來講,希爾排序其實就是直接插入排序的乙個改良版,希爾排序的速度要遠勝於直接插入排序;

從圖中可以看到:

1. 我們將原始資料分割按照某個個數分割為幾個分組;

2. 然後一直按照預設的大小一直分割下去,知道只有乙個元素時停止(前面如果按照規定的元素個數來劃分有剩餘的話就輪空);

3. 然後從下向上一次排序;知道陣列全部有序;

4. 其中,我在畫圖的時候只是隨意的切割方法,其實在很多前輩做了大量的測試後發現,當gap = gap/3+1;時是效率最高的;

//希爾排序  時間複雜度在n^1.25~1.6n^1.25

void shellsort(int *array, size_t size)

array[end + gap] = key;}}

}

插入排序(直接插入排序 希爾排序)

直接插入排序 基本思想 假設待排序的數存放在陣列arr 1.n 中。初始時,arr 1 自成1個有序區,無序區為arr 2.n 從i 2起直至i n為止,依次將arr i 插入當前的有序區arr 1.i 1 中,生成含n個記錄的有序區。演算法複雜度 對於具有n個記錄的檔案,要進行n 1次排序 各種狀...

插入排序 直接插入排序 希爾排序

1.直接插入排序 兩個陣列,有序陣列和無序陣列。排序前 無序陣列裡面所有的值都是無序的,有序陣列沒有值 排序中 無序陣列中拿出乙個數,放到有序陣列當中,有序陣列拿到數,將其按照大小有序的插入到無序陣列中 排序後 無序陣列中沒有數,有序陣列中的數為有序的。假設有一組無序序列 r0,r1,rn 1。1 ...

插入排序 直接插入排序 希爾排序

一 直接插入排序 1.思想 直接排序法,可以分為兩個部分,一部分是有序的,一部分是無序的.從這個圖上,應該是能看清楚直接插入排序的思想了.將無序部分的第乙個與有序部分進行比較.從有序部分的後面向前面比較,然後不斷地挪動有序部分的資料的位置 static void insertsort listlis...