Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void swap(int *base, int a, int b)
  5. {
  6. int t = base[a];
  7. base[a] = base[b];
  8. base[b] = t;
  9. }
  10.  
  11. void insertsort(int *base, int left, int right)
  12. {
  13. int i = left + 1;
  14. while (i <= right) {
  15. int loc = i - 1;
  16. while (loc >= 0 && abs(base[loc + 1]) < abs(base[loc])) {
  17. swap(base, loc + 1, loc);
  18. loc--;
  19. }
  20. i++;
  21. }
  22. }
  23.  
  24. void merge(int k, int l, int m, int *base)
  25. {
  26. int t[m - k + 1];
  27. int i = k;
  28. int j = l + 1;
  29. int h = 0;
  30. while (h < m - k + 1) {
  31. if (j <= m && (i == l + 1 || abs(base[j]) < abs(base[i]))) {
  32. t[h] = base[j];
  33. j++;
  34. }
  35. else {
  36. t[h] = base[i];
  37. i++;
  38. }
  39. h++;
  40. }
  41. for (i = 0; i <= h - 1; i++) base[k + i] = t[i];
  42. }
  43.  
  44. void mergesortrec(int low, int high, int *base)
  45. {
  46. if (low < high) {
  47. if (high - low + 1 < 5) {
  48. insertsort(base, low, high);
  49. }
  50. else {
  51. int med = (low + high) / 2;
  52. mergesortrec(low, med, base);
  53. mergesortrec(med + 1, high, base);
  54. merge(low, med, high, base);
  55. }
  56. }
  57. }
  58.  
  59. void mergesort(int n, int *base)
  60. {
  61. mergesortrec(0, n - 1, base);
  62. }
  63.  
  64. int main()
  65. {
  66. int n;
  67. scanf("%d\n", &n);
  68. int a[n];
  69. int i;
  70. for (i = 0; i < n; i++) scanf("%d", &a[i]);
  71. mergesort(n, a);
  72. for (i = 0; i < n; i++) printf("%d ", a[i]);
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement