#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void
merge(int n1,const int a1[],int n2,const int a2[],int out[]) {
int i1;
int i2;
int iout;
i1=i2=iout=0;
while(i1 < n1 || i2 < n2) {
if(i2 >= n2 || ((i1 < n2) && (a1[i1] < a2[i2]))) {
out[iout++] = a1[i1++];
}
else {
out[iout++] = a2[i2++];
}
}
}
void
mergeSort(int n,const int a[],int out) {
int *a1;
int *a2;
int i ;
if(n<2) {
memcpy(out , a, sizeof(int)*n);
} else {
a1 = malloc(sizeof(int)*(n/2));
a2 = malloc(sizeof(int)*(n-n/2));
mergeSort(n/2,a,a1);
mergeSort(n-n/2,a+n/2,a2);
merge(n/2,a1,n-n/2,a2,out);
free(a1);
free(a2);
}
}
#define N (3)
int
main(int argc,char **argv) {
int a[N];
int b[N];
int i;
for(i = 0; i < N; i++) {
a[i] = N-i-1;
}
for(i = 0; i < N; i++) {
printf("%d ",a[i]);
}
putchar('\n');
mergeSort(N,a,b);
for(i = 0; i < N; i++) {
printf("%d ",b[i]);
}
putchar('\n');
return 0;
}
归并排序的思想就是
分治
和归纳
. 一个有序数组和另外一个有序数组合并, 那么还是一个有序数组, 这个叫merge
; 然后一个无序数组就变成一个有序数组的过程, 就是分治, 把无序数组递归的分治成若干个小数组(甚至是1个元素的数组), 变成排序的数组, 然后再进行归纳的过程.弄懂思想的话, 代码应该还是很好理解和编写的吧