一,插入排序介紹
插入排序是基於比較的排序。所謂的基於比較,就是通過比較陣列中的元素,看誰大誰小,根據結果來調整元素的位置。
因此,對於這類排序,就有兩種基本的操作:①比較操作; ②交換操作
其中,對於交換操作,可以優化成移動操作,即不直接進行兩個元素的交換,還是用乙個樞軸元素(tmp)將當前元素先儲存起來,然後執行移動操作,待確定了最終位置後,再將當前元素放入合適的位置。(下面的插入排序就用到了這個技巧)--因為,交換操作需要三次賦值,而移動操作只需要一次賦值!
有些排序演算法,比較次數比較多,而移動次數比較少,而有些則相反。比如,歸併排序和快速排序,前者移動次數比較多,而後者比較次數比較多。
這裡主要介紹插入排序
二,插入排序演算法分析
插入排序演算法有種遞迴的思想在裡面,它由n-1趟排序組成。初始時,只考慮陣列下標0處的元素,只有乙個元素,顯然是有序的。
然後第一趟 對下標 1 處的元素進行排序,保證陣列[0,1]上的元素有序;
第二趟 對下標 2 處的元素進行排序,保證陣列[0,2]上的元素有序;
.....
.....
第n-1趟對下標 n-1 處的元素進行排序,保證陣列[0,n-1]上的元素有序,也就是整個陣列有序了。
它的遞迴思想就體現在:當對位置 i 處的元素進行排序時,[0,i-1]上的元素一定是已經有序的了。
三,插入排序演算法實現
public static void charusort(int arr)
}} system.out.println(arrays.tostring(arr));
}
四,複雜度分析
①插入排序的時間複雜度 就是判斷比較次數有多少,而比較次數與 待排陣列的初始順序有關,當待排陣列有序時,沒有移動操作(第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)
插入排序演算法
插入排序演算法 思想 把排序過程看作是序列單個有序擴充套件為整體有序的過程,即首先取序列第二個元素與第乙個元素比較,將其插入合適位置,再將第三個元素與前兩個元素比較,將其插入合適位置,如此進行,直到最後取第n個元素與前n 1個元素進行比較並將其插入合適位置。演算法 建立日期 2004 12 14 插...
演算法 插入排序
include include 插入排序 n 2為的效率。具體思想 將陣列分為兩部分,一部分是有序的,一部分為無序的 然後從無序中選取乙個數插入在有序的數中的恰當的位置,以此迭代,直到無序的數全部遍厲完畢 void insert sort int a,int n a j tmp break retu...
插入排序演算法
下面這段話摘自 一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 將...