实现思想
先将所有的记录完全分开,然后两两合并,在合并的过程中排序,最终能够得到一个完整的有序表。
例如对于含有n个记录的有序表,首先认为表中每个记录各为一个有序表,然后进行两两合并,使n个有序表变为n/2(向上取整)个长度为2或者1的有序表,通过不断的进行两两合并,最终得到一个长度为n的有序表。这种归并排序方法称为:2-路归并排序。
实现代码
#include <stdio.h>
#include <stdlib.h>
#define MAX 7
void Merge(int src[], int dest[], int start, int middle, int end)
{
int j, k;
for (j = middle + 1, k = start; start <= middle && j <= end; k++) {
if (src[start] < src[j])
dest[k] = src[start++];
else
dest[k] = src[j++];
}
while (start<=middle) {
dest[k++] = src[start++];
}
while (j<=end) {
dest[k++] = src[j++];
}
}
void MSort(int src[], int dest[], int start, int end) {
int dest2[MAX];
if (start == end) {
dest[start] = src[start];
}
else {
int middle = (start + end) / 2;
MSort(src, dest2, start, middle);
MSort(src, dest2, middle + 1, end);
Merge(dest2, dest, start, middle, end);
}
}
int main(int argc, char* argv[])
{
int arr[] = {49, 38, 65, 97, 76, 13, 27};
int len = sizeof(arr) / sizeof(int);
MSort(arr, arr, 0, len-1);
for (int i = 0; i < len;i++) {
printf("%d, ", arr[i]);
}
return 0;
}