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

2021-08-17 22:27:25 字數 2822 閱讀 8791

演算法思想:

歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。

遞迴實現

#include 

void merge(int a, int left, int m, int right);

void mergesortaux(int a, int left, int right);

void mergesort(int a, int len);

int main(void)

mergesort(a, len);

printf("排序後的結果為:\n");

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

printf("\n");

return0;}

void merge(int a, int left, int mid, int right)

for (int m = left; m <= right; ++m)

else

if (j > right)

else

else }}

}void mergesortaux(int a, int left, int right)

}void mergesort(int a, int len)

非遞迴實現

#include 

#include

#include

void mergesort(int a, int len);

void mergepass(int a, int b, int s, int n);

void merge(int c, int d, int l, int m, int r);

void printarray(int a, int len);

int main(void) ;

mergesort(a, 5);

printarray(a, 5);

return0;}

void mergesort(int a, int len)

int s = 1;

while (s < len)

free(b);

}void mergepass(int a, int b, int s, int len)

if (i + s < len)

else

}}void merge(int a, int b, int l, int m, int r)

else

if (j > r)

else

if (a[i] < a[j])

else

}}void printarray(int a, int len)

printf("\n");

}

在實際應用中,待排序的數中,裡面會存在一些已經有序的資料,在實際應用歸併排序中,可以待排序的數中已經有序的數分成一組,這可以提高排序的效率。

自然歸併排序

#include

using

namespace

std;

#define n 100

int boundary_size;

int boundary[n];

void merge(int c, int d, int l, int m, int r);

void printarray(int a, int n);

void getbpoint(int a, int b, int n);

void mergepass(int x, int y, int s, int n);

void mergesort(int a, int n);

int main(void)

getbpoint(a,boundary,n);

mergesort(a,n);

printarray(a,n);

return

0;

}void getbpoint(int a, int b, int n)

boundary_size = j;

}void mergesort(int a, int n)

int s = 1;

while(s < boundary_size)

delete b;

}void mergepass(int x, int y, int s, int n)

if(i + s < boundary_size)

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

else

if(i < boundary_size)

} void merge(int c, int d, int l, int m, int r)

if(i>m)

for(int q = j; q <= r; q++)

d[l++] = c[q];

else

for(int p = i; p <= m; p++)

d[l++] = c[p];

} void printarray(int a, int n)

時間複雜度

歸併排序排序是一種穩定的排序,時間複雜度為o(nlogn)

歸併排序 遞迴 非遞迴

首先簡單的介紹一下歸併演算法的核心思想 將我們將一組資料分成若干個組,即分到每組資料為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...

歸併排序(非遞迴)

接著上篇文章歸併排序 遞迴 來 下,歸併排序的非遞迴實現。歸併排序的非遞迴實現 1 將兩個相鄰的有序序列歸併成乙個有序序列,我們稱為 一次歸併 2 一趟歸併 是多次執行 一次歸併 的結果。在 一趟歸併 中,除最後乙個有序序列外,其他有序序列中記錄的個數 稱為序列長度 相同,用h表示。現在的任務是把若...