Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Sep 17th, 2012  |  syntax: None  |  size: 1.06 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. void merge(int* a, int n);
  2. void mergeSort(int* a, int n);
  3.  
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7.  
  8. #define NUM_ELEMENTS_IN(t) (sizeof(t)/sizeof(*t))
  9.  
  10. int main(int argc, char const *argv[])
  11. {
  12.         int a[] = {3,4,5,1,-1,-2,99,6};
  13.         int i;
  14.         mergeSort(a,NUM_ELEMENTS_IN(a));
  15.        
  16.         for (i = 0; i < NUM_ELEMENTS_IN(a); ++i)
  17.         {
  18.                 printf("%d ",a[i]);
  19.         }
  20.         return 0;
  21. }
  22.  
  23. void mergeSort(int* a, int n){
  24.  
  25.         if( n <= 1 ){
  26.                 return;
  27.         }
  28.  
  29.         mergeSort(a, n/2 );
  30.         mergeSort(a + n/2, n - n/2);
  31.         merge(a, n );
  32. }
  33.  
  34.  
  35. //merge n/2 from beginning with
  36. //n - n/2 elements from n/2+1 element
  37. //which are sorted in increased order themselves
  38. void merge(int* a, int n){
  39.         int i,k = 0,m = 0;
  40.  
  41.         int* temp = (int*)malloc(sizeof(int) * n);
  42.  
  43.         for (i = 0; (i < n) && (k < n/2) && (m < (n-n/2)) ; ++i)
  44.         {
  45.  
  46.                 if( a[k] < a[n/2+m]){
  47.  
  48.                         temp[i] = a[k];
  49.                         k++;
  50.                 }else{
  51.                         temp[i] = a[n/2+m];
  52.                         m++;
  53.                        
  54.                 }
  55.         }
  56.  
  57.  
  58.         if( k < n/2 ){
  59.                 for( ;k < n/2;k++ ){
  60.                         temp[i++] = a[k];
  61.                 }
  62.         }else if( m < (n-n/2)){
  63.                 for(; m < (n-n/2); m++){
  64.                         temp[i++] = a[n/2+m];
  65.                 }
  66.         }
  67.  
  68.         memcpy(a,temp,sizeof(int) * n);
  69.         free(temp);
  70. }