void mergesort(int a[], int p, int r) { int q; if (p < r) { q = (p + r) / 2; mergesort(a, p, q); mergesort(a, q+1, r); merge(a, p, q, r); } } void merge(int a[], int p, int q, int r) { int len1, len2, *lp, *rp, i, j, k; len1 = q - p + 1; len2 = r - q; lp = (int *)malloc(sizeof(int) * (len1+1)); rp = (int *)malloc(sizeof(int) * (len2+1)); for(i = 0; i < len1; i++){ lp[i] = a[p+i]; } for(j = 0; j < len2; j++){ rp[j] = a[1+q+j]; } lp[i] = rp[j] = MERGE_OO; i = j = 0; for(k = p; k <= r; k++){ if (lp[i] <= rp[j]){ a[k] = lp[i++]; }else{ a[k] = rp[j++]; } } }
测试用例
#include <stdio.h> #include <stdlib.h> #define MERGE_OO 10000 int main() { int a[] = {5, 1, 7, 12, 9, 6}; int i; mergesort(a, 0, 5); for (i = 0; i < 6; i++) { printf("%d%s", a[i], (i==5)?"\n":" "); } return 0; }