一共有三種:直接插入排序、希爾排序和折半插入排序。最後乙個折半插入排序,感覺用在陣列上面不太方便,就沒寫出來。
遞迴實現沒有思路,使用的非遞迴演算法。
直接插入排序
這個演算法預設前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...