八大排序之插入排序(直接插入排序 希爾排序)

2021-08-30 13:59:28 字數 1792 閱讀 2303

插入排序(英語:insertion sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序可以分為直接插入排序和希爾排序。

直接插入排序

相信大家都玩過撲克牌(即使沒玩過,也聽說過)。

這就是插入,模擬到我們排序中,就能得到如下步驟

從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

如果該元素(已排序)大於新元素,將該元素移到下一位置

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

將新元素插入到該位置後

重複步驟2~5

**如下:

void

insertsort

(int arr,

int size)

else

} arr[j +1]

= key;

}}

時間複雜度:o(n ^ 2)空間複雜度:o(1)直接插入排序是穩定的陣列越有序,直接插入排序越快二分插入排序

由於上述在查詢比較關鍵碼的時候,會比較慢。因為關鍵碼前面已經有序,就可以運用二分查詢的思想來判斷關鍵碼的位置。

void

insertsort

(int arr,

int size)

else

}//這裡一定要大於等於left,因為在上面left已經加1

for(

int j = i -

1; j >= left; j--

) arr[left]

= tmp;

}}

希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。

因為直接插入排序依次只能移動乙個資料,但如果要是依次可以移動多個資料,排序時間肯定就短了,於是便有了希爾排序。

基本思想:

void

__insertsort

(int arr,

int size,

int gap)

else

} arr[j + gap]

= key;}}

}void

shellsort

(int arr,

int size)

}}

上述中gap = size / 3 + 1這是經過大量實驗推算出來的,第一步的增量取這個值會更合理雖然上述**比較容易理解,但不夠簡潔。

優化:

void

__insertsort

(int arr,

int size,

int gap)

else

} arr[j + gap]

= key;}}

void

shellsort

(int arr,

int size)

}}

直接插入排序可以看做是增量為1的希爾排序

八大排序 插入排序 直接插入排序

基本思想 將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。直接插入排序示例 如果碰見乙個和插入元素相等的,那麼插入元素把想插入的...

八大排序 直接插入排序

直接插入排序 straight insertion sort 的基本操作是將乙個元素插入到序列已經有序的那一部分中去,從而使序列中有序的部分逐漸擴大,直到整個序列有序。博主認為直接插入排序過程比較容易理解,所以不作過多贅述,直接上 include void main int length sizeo...

插入排序之直接插入排序

插入排序概述 有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法 插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為...