编辑代码

#include<stdio.h>

void merge(int arr[], int l, int m, int r) {
   int i, j, k, nl, nr;
   nl = m-l+1; nr = r-m;
   int larr[nl], rarr[nr];

   for(i = 0; i<nl; i++)
      larr[i] = arr[l+i];
   for(j = 0; j<nr; j++)
      rarr[j] = arr[m+1+j];
   i = 0; j = 0; k = l;

   while(i < nl && j<nr) {
      if(larr[i] <= rarr[j]) {
         arr[k] = larr[i];
         i++;
      }else{
         arr[k] = rarr[j];
         j++;
      }
      k++;
   }
   while(i<nl) {       //extra element in left array
      arr[k] = larr[i];
      i++; k++;
   }
   while(j<nr) {     //extra element in right array
      arr[k] = rarr[j];
      j++; k++;
   }
}

void mergeSort(int arr[], int l, int r) {
   int m;
   if(l < r) {
      int m = l+(r-l)/2;
      mergeSort(arr, l, m);
      mergeSort(arr, m+1, r);
      merge(arr, l, m, r);
   }
}

void printArray(int a[], int size) {
   int i;
   for (i=0; i < size; i++)
      printf("%d ", a[i]);
   printf("\n");
}

int main() {
   int arr[] = {12, 11, 13, 5, 6, 7};
   int len = sizeof(arr)/sizeof(arr[0]);

   printf("Given array: \n");
   printArray(arr, len);

   mergeSort(arr, 0, len - 1);

   printf("\nSorted array: \n");
   printArray(arr, len);
   return 0;
}