非遞迴版歸併排序

2022-02-05 12:27:23 字數 1995 閱讀 9092

非遞迴版的歸併排序,省略了中間的棧空間,直接申請一段o(n)的位址空間即可,因此空間複雜度為o(n),時間複雜度為o(nlogn);

開始以間隔為1的進行歸併,也就是說,第乙個元素跟第二個進行歸併。第三個與第四個進行歸併;

然後,再以間隔為2的進行歸併,1-4進行歸併,5-8進行歸併;

再以2*2的間隔,同理,知道2*k超過陣列長度為止。

while(i

當不夠兩組進行歸併是,如果超過k個元素,仍然進行歸併;如果剩餘元素不超過k個元素,那麼直接複製給中間陣列。

while(i <= length-2*k)

if(i < length-k+1)//

如過剩餘個數比乙個k長度還多...那麼就在進行一次合併

sort(arr1,temp,i,i+k-1,length-1

);

else

for(j=i;j)

temp[j] = arr1[j];

void mergesort(int *arr,int

length)

}void merge(int *arr1,int *temp,int k,int

length)

if(i < length-k+1)//

如過剩餘個數比乙個k長度還多...那麼就在進行一次合併

sort(arr1,temp,i,i+k-1,length-1

);

else

for(j=i;j)

temp[j] =arr1[j];

for(i=0;i)

}void sort(int *arr3,int *arr1,int begin,int m,int

end)

if(i <=m)

else

}

#include #include 

#include

int arrtest1[10] = ;

int arrtest2[10] = ;

int arrtest3[10] = ;

void copy(int *from,int *arr,int

length);

void print(int *arr,int

length);

void mergesort(int *arr,int

length);

void merge(int *arr1,int *temp,int k,int

length);

void sort(int *arr3,int *arr1,int begin,int m,int

end);

intmain()

void mergesort(int *arr,int

length)

}void merge(int *arr1,int *temp,int k,int

length)

if(i < length-k+1)//

如過剩餘個數比乙個k長度還多...那麼就在進行一次合併

非遞迴版歸併排序

非遞迴版的歸併排序,省略了中間的棧空間,直接申請一段o n 的位址空間即可,因此空間複雜度為o n 時間複雜度為o nlogn 開始以間隔為1的進行歸併,也就是說,第乙個元素跟第二個進行歸併。第三個與第四個進行歸併 然後,再以間隔為2的進行歸併,1 4進行歸併,5 8進行歸併 再以2 2的間隔,同理...

歸併排序(遞迴 非遞迴 自然歸併排序)

演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...

歸併排序 遞迴 非遞迴

首先簡單的介紹一下歸併演算法的核心思想 將我們將一組資料分成若干個組,即分到每組資料為1個元素的情況下就不用分了,然後在分別比較每兩組資料元素的大小,將其合併為一組資料再去和其他同等級別的組的資料元素取比較,然後合併到臨時的空間中然後在複製給原空間,依此類推,直到最後全部合併完畢,陣列就成為一組有序...