演算法思想:
歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。
遞迴實現
#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表示。現在的任務是把若...