插入排序和歸併排序

2022-02-06 18:02:51 字數 1039 閱讀 9059

本人在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),最好的情況是o(n),最差的情況是o(n^2)

演算法穩定性:記錄的相對在排序的過程中保持不變,排序前i在j之前(i歸併排序主要用到了分治的思想。假設乙個陣列中的n個數,假設為10,邏輯上分成兩組,即a[0]-a[4]為a組,a[5]-a[10]為b組,且a組和b組各自都是排序好的數,我們首先在每組中取出第乙個數比較,即(a[0]和a[5]比較大小,若a[0]小,則將a[0]插入到臨時陣列temp中,接著a[1]再和a[5]比較大小,小的一方還是放到臨時陣列中)。完成合併之後,再使用遞迴的思想,將10個數的排序分治成每乙個數字,即兩個數比較大小之後合併成一組,一組兩個數和另外一組的兩個數合併到一組中,依次類推。

public static void merge(int array,int left,int mid,int right){

int temp = new int[right-left+1];

int i = left,j = mid+1,k = 0;

//將乙個陣列通過下標分成邏輯上的兩組數,比較兩組數a,b,數小的放到臨時陣列

while(i<=mid&&j<=right){

if(array[i]空間複雜度為o(1),最好的情況是o(nlgn),最差的情況是o(nlgn),是穩定的排序

插入排序和歸併排序

一共有三種 直接插入排序 希爾排序和折半插入排序。最後乙個折半插入排序,感覺用在陣列上面不太方便,就沒寫出來。遞迴實現沒有思路,使用的非遞迴演算法。直接插入排序 這個演算法預設前n個數是已經排好序的,n隨著你的插入逐漸變大,最開始是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...