歸併排序遞迴及非遞迴實現(自然合併排序

2021-07-23 07:42:46 字數 1177 閱讀 6042

普通的歸併排序遞迴實現比較簡單,就不在此贅述,一看就懂。下面貼上**。

#include #include using namespace std;

template void merge(t arr, const int start, const int middle, const int end, const int size)

while(left <= middle) //程式退出迴圈只有兩種可能,分別處理

room[i++] = arr[left++];

while(right <= end)

room[i++] = arr[right++];

for(int i=start,j=0; i<=end; ++i,++j) //將排序完成的一串數copy回原陣列

arr[i] = room[j];

delete room;

}template void merge_sort(t arr, int start, int end) //歸併排序主函式,start和end分別為起始和終止的下標

}template void print(t arr, const int size) //列印函式

while(left <= middle)

y[start++] = x[left++];

while(right <= end)

y[start++] = x[right++];

}template void merge_pass(t x, t y, int s, int n)

,i=0,同時s=1時,n-2*s=0此時等於i,可進行合併

merge(x, y, i, i+s-1, i+2*s-1); //採用傳遞起始,中間,終點下標形式,需要-1,例如上面的陣列,s=1時終點下標0+2*1-1=1

i += 2*s; //每次按步長走

}

if(i+s < n) //如果前面子陣列合併完成,還剩一組子陣列,例如5,4,3,2,1,1,2步長為2時,54和32合併,剩餘11大小滿足子陣列,就合併它和2

merge(x, y, i, i+s-1, n-1);

else

}template void print(t *arr, const int size)

{ for(int i=0; i

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

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

歸併排序 遞迴 非遞迴

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

歸併排序 非遞迴實現

我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列r 0 n 1 看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n 2個長度為2的有序表 將這些有序序列再次歸併,得到n 4個長度為4的...