歸併排序 非遞迴

2021-08-07 13:29:28 字數 1515 閱讀 6740

//歸併排序1(迭代的方式)

#include

#include

using namespace std;

//做一次兩個排序陣列的合併

template

void merge(t* initlist, t*mergelist, int l, int m, int n)//initelist是要歸併排序的陣列,mergelist是排序好要儲存結果的陣列,l是前面陣列的第乙個下標,m陣列乙份為二前面陣列的最後乙個元素的下標,n是陣列的個數

else

}copy(initlist + i1, initlist + m + 1, mergelist+iresult);//如果第乙個陣列有剩餘,把剩下的直接拷貝到結果陣列裡面

copy(initlist + i2, initlist + n + 1, mergelist + iresult);//如果第二個陣列有剩餘,把剩下的直接拷貝到結果陣列裡面}

//歸併一行

template

void mergepass(t* initlist, t*resultlist, const int n,const int s)//n代表大陣列中資料的個數,s代表要進行歸併的小陣列的長度

//完整的歸併排序

template

void mergesort(t*a,const int n)

deletetmplist;}

int main()

;//0是故意寫的不用a[0]

int b[11] = ;//歸併的陣列放在b陣列中

merge(a, b, 1, 4, 10);

for (int i = 1; i < 11; ++i)

int m = ;

int n[11] = ;//每一次得到的結果,放在這個陣列裡

mergepass(m, n, 10, 1);//歸併第一次

for (int i = 1; i < 11; i++)

mergepass(n, m, 10, 2);//歸併第二次

for (int i = 1; i < 11; i++)

mergepass(m, n, 10, 4);//歸併第三次

for (int i = 1; i < 11; i++)

mergepass(n, m, 10, 8);//歸併第四次

for (int i = 1; i < 11; i++)

cout << "上面都是中間結果的測試" << endl;

cout << "下面開始測試mergesort" << endl;

int x = ;

mergesort(x, 10);

for (int i = 0; i < 11; i++)

cout << x[i] << endl;

cout << " ddd" << endl;

return 0;

}

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

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

歸併排序 遞迴 非遞迴

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

歸併排序 非遞迴

static void merging sort beta int a 歸併排序演算法 非遞迴 static void mergepass int source,int temp,int gap,int len if i len gap else static void merge beta int...