排序演算法總結之插入排序

2021-09-07 06:31:38 字數 1677 閱讀 8449

一,插入排序介紹

插入排序是基於比較的排序。所謂的基於比較,就是通過比較陣列中的元素,看誰大誰小,根據結果來調整元素的位置。

因此,對於這類排序,就有兩種基本的操作:①比較操作; ②交換操作

其中,對於交換操作,可以優化成移動操作,即不直接進行兩個元素的交換,還是用乙個樞軸元素(tmp)將當前元素先儲存起來,然後執行移動操作,待確定了最終位置後,再將當前元素放入合適的位置。(下面的插入排序就用到了這個技巧)--因為,交換操作需要三次賦值,而移動操作只需要一次賦值

有些排序演算法,比較次數比較多,而移動次數比較少,而有些則相反。比如,歸併排序和快速排序,前者移動次數比較多,而後者比較次數比較多。

這裡主要介紹插入排序

二,插入排序演算法分析

插入排序演算法有種遞迴的思想在裡面,它由n-1趟排序組成。初始時,只考慮陣列下標0處的元素,只有乙個元素,顯然是有序的。

然後第一趟 對下標 1 處的元素進行排序,保證陣列[0,1]上的元素有序;

第二趟 對下標 2 處的元素進行排序,保證陣列[0,2]上的元素有序;

第n-1趟對下標 n-1 處的元素進行排序,保證陣列[0,n-1]上的元素有序,也就是整個陣列有序了。

它的遞迴思想就體現在:當對位置 i 處的元素進行排序時,[0,i-1]上的元素一定是已經有序的了。

三,插入排序演算法實現

1

public

class

insertsort

12 a[j] =tmp;//插入到合適的位置13}

14}1516

//for test purpose

17public

static

void

main(string args) ;

19insertsort(arr);

20for

(integer i : arr) 23}

24 }

四,複雜度分析

①插入排序的時間複雜度 就是判斷比較次數有多少,而比較次數與 待排陣列的初始順序有關,當待排陣列有序時,沒有移動操作(第8行for不成立),此時複雜度為o(n),當待排陣列是逆序時,比較次數達到最大--對於下標 i 處的元素,需要比較 i-1 次。總的比較次數:1+2+...+n-1 ,故時間複雜度為o(n^2)

①可以看出,演算法中只用到了乙個臨時變數(第6行),故空間複雜度為o(1)

其實,插入排序的比較次數與陣列的逆序數相關,因為插入排序在將某個元素插入到合適位置時(**第12行),其實就是消除這個元素的逆序數。

由定理:n個互異數的陣列的平均逆序數是 n(n-1)/4,可知:基於相鄰元素之間的比較和交換的演算法的時間複雜度的乙個下界為o(n^2)

比較氣泡排序啊。。。。它採用的思路是:相鄰兩個元素比較,將小的放在前頭。故氣泡排序的時間複雜度為o(n^2)。。。

基於上面這個定理,另外乙個排序演算法:希爾排序,採用了增量序列。因此,它可能獲得乙個更好的時間複雜度。

比如,當希爾排序使用hibbard增量序列時,它的最壞執行時間為o(n3/2)

五,參考資料

各種排序演算法的總結

《資料結構與演算法分析》maw著

排序演算法總結歸納 之 插入排序

按照排序的資料量的大小,一般將排序方法分為內排序和外排序。內排序是指待排序的資料元素都存放在記憶體中,而外排序則指待排序的資料量太大,不能同時存放在記憶體中,整個排序過程需要在內外存之間多次交換才能進行。常用的內排序演算法有 插入排序 選擇排序 交換排序 歸併排序和基數排序等。而外排序演算法則有多路...

排序演算法總結 插入排序

插入排序,顧名思義就是將乙個元素插入到適當的位置。其演算法核心是 1.將第乙個元素看做是個單獨的序列。顯然,只有乙個元素的序列肯定是有序序列。2.然後將和第二個元素做比較。如果第二個元素小,那麼就將第二個元素插入到第乙個元素前面,這樣我們就得到了乙個擁有兩個元素的有序序列。3.依次掃瞄剩餘元素,每掃...

排序演算法之插入排序

排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...