插入排序和歸併排序

2021-10-03 08:52:34 字數 1788 閱讀 9912

一共有三種:直接插入排序、希爾排序和折半插入排序。最後乙個折半插入排序,感覺用在陣列上面不太方便,就沒寫出來。

遞迴實現沒有思路,使用的非遞迴演算法。

直接插入排序

這個演算法預設前n個數是已經排好序的,n隨著你的插入逐漸變大,最開始是1。

然後從後往前逐漸查詢應該插入的位置;我的演算法是從小到大,那就依次對比當前位置的值是否比要插入的值大,如果大就往後移動乙個位置,小於等於當前位置的值就進行插入結束這一次的插入操作,進入下一次。

希爾排序

這個排序演算法的思路就是將陣列分為好多組,然後逐漸減少,最終只剩下一組,就是最終的結果。

最開始將陣列根據初始增量分為兩兩一組,在每一組內進行排序;逐漸縮短增量,直到增量為一,就是排好序的陣列。

在組內排序的演算法其實可以是別的演算法。

折半插入排序

和直接插入排序思路相同,但是在查詢插入點的時候,是從已經排好序的陣列中間查詢要插入的點,查詢到之後將插入點之後的數依次後移,將數插入。

陣列從大依次切開,分為n組,然後再將相鄰的兩組進行合併,並排序,最後只剩下一組就是結果。這個演算法使用遞迴會比較簡單點。非遞迴實現,沒思路。

package 演算法設計與分析;

public

class

work3

;insertsort1

( nums )

;for

(int i : nums )

system.out.

println

( i );}

//插入排序--直接插入排序

public

void

insertsort1

(int

array )

//將要插入的數儲存在,最後查詢到的位置上

array[j+1]

= temp;}}

//插入排序--希爾排序

public

void

insertsort2

(int

array )

array[k+len]

= temp;}}

}}//歸併排序--遞迴演算法

public

void

mergesort

(int

array )

//先對陣列進行分割,然後進行合併,遞迴

public

void

devidearray

(int start,

int end,

int[

] array )

}//對陣列進行合併

public

void

mergearray

(int start,

int middle,

int end,

int[

] array )

else

//只有左部在範圍之內,直接新增上去,不需要再進行排序

}else

if( left <= middle && right > end )

else

if( left > middle && right <= end )

else

break;}

//將歸併好的部分重新新增在原陣列的位置

for(

int i = start; i <= end; i++)}

public

static

void

main

(string[

] args)

}

插入排序和歸併排序

本人在csdn的原鏈結 首先是插入排序,這個過程就可以比喻成左手放牌 已排好序 右手抓牌 牌堆上最頂端的一張牌 然後放到左手,插到正確的位置 for j 2 to a.length key a j i j 1 while i 0 a i 0 key a i a i 1 key 空間複雜度為o 1 最...

插入排序和歸併排序

插入排序 c include using namespace std void main 定義乙個未排好序的陣列 int i,j,key for i 0 i 6 i 輸出排序前的序列 printf 3d a i for j 1 j 6 j a i 1 key coutprintf 3d a i co...

插入排序 歸併排序

插入排序 define len 5 int a len void insertion sort void int i,j,k for j 1 j len j k a j i j 1 while i 0 a i k a i 1 a i i a i 1 k 歸併排序 int a 8 void merge...