插入排序演算法

2022-09-02 12:09:11 字數 1892 閱讀 6620

插入排序有:直接插入排序、二分法插入排序、希爾排序。

排序是一種很直觀的演算法,用一種視覺化的方法來觀察演算法的執行過程是很有用的,各位可以點選此鏈結來更加透徹得領悟各類排序演算法。

下面是直接插入排序

:基本思想就是,p從1開始一直往後移動,每次移動(即指外層迴圈的每次迴圈)前從索引0到p-1位置都是已經排好序的,每次移動後保證從索引0到p位置都是已經排序了的,看起來好像在內層迴圈要不停的交換元素,實際上不需要,只需要先把元素存起來,元素一直往後複製以覆蓋,最後迴圈結束後再賦值。這和堆的插入刪除演算法(即上濾下濾)是類似的。

因為有兩個迴圈,所以演算法的時間複雜度:

最壞情況:是o(

n2)。最好情況:

是o(n)。最好的情況就是資料已經預先排過序了。

平均情況:也是o(

n2)。

演算法是穩定

的。

public static >

void insertionsort( anytype [ ] a )

}

下面是二分插入排序

:基本思想就是,

p從1開始一直往後移動,每次移動(即指外層迴圈的每次迴圈)前

從索引0到p-1位置都是已經排好序的

,每次移動後保證從索引0到p位置都是已經排序了的。但是在尋找插入位置有點不一樣了,是通過二分查詢的思想來找。

二分插入排序的主要操作為比較+後移賦值。

最壞情況

:每次都在有序序列的起始位置插入,則整個有序序列的元素需要後移,時間複雜度為o(n2

)。最好情況

:待排序陣列本身就是正序的,每個元素所在位置即為它的插入位置,此時時間複雜度僅為比較時的時間複雜度,為o(l

og2n

)。平均情況

:o(n2)。

演算法是穩定

的。

public static void sort(int a)

else

}//退出whihe迴圈時,left肯定等於right+1,,而這個位置就是插入位置

for (int j = i - 1; j >= left; j--)

a[j + 1] = a[j];//元素往後移動

if(left!=i)//當i元素就應該放在i位置時,此時left就會等於i位置,但此時不需要進行插入

a[left] = temp; }}

下面是希爾排序:

基本思想是:

先取乙個小於陣列長度的整數d1作為第乙個增量

,把檔案的全部記錄分組,一共分為d1組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序

;然後,取第二個增量d2

希爾排序的時間複雜度與增量序列的選取有關:

如果是選取的希爾增量:

最壞情況:是o(n

2)。最好情況:是

o(n)。

平均情況:

演算法是不穩定的。

其餘的增量序列還有hibbard:,sedgewick:該序列中的項或者是9*4^i

- 9*2^i + 1或者是4^i - 3*2^i + 1。

public static >

void shellsort( anytype [ ] a )

}

插入排序演算法

插入排序演算法 思想 把排序過程看作是序列單個有序擴充套件為整體有序的過程,即首先取序列第二個元素與第乙個元素比較,將其插入合適位置,再將第三個元素與前兩個元素比較,將其插入合適位置,如此進行,直到最後取第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,直到找到已排序的元素小於或者等於新元素的位置 將...