fork download
  1. //(c)Terminator
  2. #include <stdio.h>
  3.  
  4.  
  5. // слияние упорядоченных пар в массив
  6. void __merge(int* arr, int* dst, int first, int mid, int last) {
  7. int* off = dst;
  8. int ipos = first;
  9. int pos = mid + 1;
  10. while((first <= mid) && (pos <= last)) {
  11. if(arr[first] <= arr[pos])
  12. *dst++ = arr[first++];
  13. else
  14. *dst++ = arr[pos++];
  15. }
  16.  
  17. while(first <= mid)
  18. *dst++ = arr[first++];
  19. while(pos <= last)
  20. *dst++ = arr[pos++];
  21.  
  22. int* ptr = arr + ipos;
  23. while(off != dst)
  24. *ptr++ = *off++;
  25. }
  26.  
  27.  
  28. // сортировки слиянием
  29. void merge_sort(int* arr, int* tmp, int first, int last) {
  30. if(first < last) {
  31. int mid = (first + last) / 2;
  32. merge_sort(arr, tmp, first, mid);
  33. merge_sort(arr, tmp, mid + 1, last);
  34. __merge(arr, tmp, first, mid, last);
  35. }
  36. }
  37.  
  38.  
  39.  
  40. int main(void){
  41. const int N = 10;
  42. int arr[N] = { 7, 3, 6, 8, 4, 9, 10, 1, 5, 2 };
  43.  
  44. int tmp[N];
  45. merge_sort(arr, tmp, 0, N - 1);
  46.  
  47. for(int i = 0; i < N; ++i)
  48. printf("%d ", arr[i]);
  49. getchar();
  50. return 0;
  51. }
Success #stdin #stdout 0s 3300KB
stdin
Standard input is empty
stdout
1 2 3 4 5 6 7 8 9 10