插入排序 inertion sort

2021-08-21 04:50:12 字數 2078 閱讀 7321

插入排序(insertion-sort

輸入:n個數的乙個序列.

輸入:輸入序列的乙個排列,滿足a'≤a'2≤...a'n.

分類:包括:

直接插入排序

,二分插入排序(又稱折半插入排序),

鍊錶插入排序,

希爾排序

(又稱縮小增量排序)。屬於穩定排序的一種(通俗地講,就是兩個相等的數不會交換位置) 。

插入排序的簡單理解:工作原理是通過構建有序序列,對於未排序的資料,在以排序序列中從後向前掃瞄,找到相應的位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),通常就像許多人排序一手撲克牌。開始時,我們的左手並且桌子上的牌面向下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的位置。為了找到一張牌的正確位置,我們從右到左將它已在手中的每張牌進行比較。拿在左手上的牌總是排序好的,原來這些牌是桌上牌堆中頂部的牌。(

每一趟將乙個待排序的記錄,按照其關鍵字的大小插入到有序佇列的合適位置裡,知道全部插入完成。)

設計:

演算法設計有很多方法。插入排序使用的是增量(incremental)方法;在排好子陣列a[1..j-1]後,將a[j]插入,形成排好序的子陣列a[1..j];

步驟

⒈從有序數列和無序數列開始進行排序;

⒉處理第i個元素時(i=2,3,…,n),數列是已有序的,而數列是無序的。用ai與ai-1,a i-2,…,a1進行比較,找出合適的位置將ai插入;

⒊重複第二步,共進行n-i次插入處理,數列全部有序。

思路

假定這個陣列的序是排好的,然後從頭往後,如果有數比當前外層元素的值大,則將這個數的位置往後挪,直到當前外層元素的值大於或等於它前面的位置為止.這具演算法在排完前k個數之後,可以保證a[1…k]是區域性有序的,保證了插入過程的正確性

插入排序演算法的分析

過程insertion-sort需要的時間依賴於輸入:排序數量大的數比排序小的數需要更長的時間。此外,依據它們已被排序的程度,insertion-sort可能需要不同數量的時間來排序兩個具有相同的輸入序列。

插入排序的偽**如下:

voidinsert_sort(int*array,unsignedintn)

*(array+j)=temp;

}}

c語言實現:

#includevoid insertionsort(int *arr,int len)

*(arr+j)=temp;

}}  int main()

;   insertionsort(arr,6);

for(i=0;i<6;i++)

return 0;

}int i,j;

int temp;

for(i=1;i0 && *(arr+j-1)>temp;j--)

*(arr+j)=temp;

}}  int main()

;   insertionsort(arr,6);

for(i=0;i<6;i++)

return 0;

}

演算法複雜度:如果目標是把n個元素的序列公升序排列,那麼採用插入排序存在最好情況和最壞情況。最好情況就是,序列已經是公升序排列了,在這種情況下,需要進行的比較操作需(n-1)次即可。最壞情況就是,序列是降序排列,那麼此時需要進行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數加上 (n-1)次。平均來說插入排序演算法的時間複雜度為o(n^2)。因而,插入排序不適合對於資料量比較大的排序應用。

插入排序 折半插入排序

折半插入排序 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...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...