loulett

HW2_heap_sort

Nov 23rd, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #define _CRT_SECURE_NO_WARNINGS
  5.  
  6. int * generate(int n)
  7. {
  8.     int * arr = (int *)calloc(n, sizeof(int));
  9.     for (int i = 0; i < n; ++i)
  10.     {
  11.         arr[i] = rand();
  12.     }
  13.     return arr;
  14. }
  15.  
  16. void swap(int &a, int &b)
  17. {
  18.     int t = a;
  19.     a = b;
  20.     b = t;
  21. }
  22.  
  23. void siftup(int * heap, int i)
  24. {
  25.     while (heap[i] > heap[(i - 1) / 2])
  26.     {
  27.         swap(heap[i], heap[(i - 1) / 2]);
  28.         i = (i - 1) / 2;
  29.     }
  30. }
  31.  
  32. void siftdown(int * heap, int i, int n)
  33. {
  34.     int left = 0, right = 0, j = 0;
  35.     while (2 * i + 1 < n)
  36.     {
  37.         left = 2 * i + 1;
  38.         right = 2 * i + 2;
  39.         j = left;
  40.         if (right < n && heap[right] > heap[left])
  41.             j = right;
  42.         if (heap[i] > heap[j])
  43.             return;
  44.         swap(heap[i], heap[j]);
  45.         i = j;
  46.     }
  47. }
  48.  
  49. void add(int * heap, int i, int &n)
  50. {
  51.     n++;
  52.     heap[n - 1] = i;
  53.     siftup(heap, n - 1);
  54. }
  55.  
  56. int delete_max(int *heap, int &n)
  57. {
  58.     int min = heap[0];
  59.     heap[0] = heap[n - 1];
  60.     n--;
  61.     siftdown(heap, 0, n);
  62.     return min;
  63. }
  64.  
  65. int main()
  66. {
  67.     int n = 0, h = 0, t = 0;
  68.     srand(time(NULL));
  69.     scanf("%d", &n);
  70.     int * arr = generate(n);
  71.     for (int i = 0; i < n; ++i)
  72.     {
  73.         add(arr, arr[i], h);
  74.     }
  75.     for (int i = n - 1; i > 0; --i)
  76.         arr[i] = delete_max(arr, h);
  77.     for (int i = 1; i < n; ++i)
  78.     {
  79.         if (arr[i - 1] > arr[i])
  80.         {
  81.             printf("ERROR");
  82.             t++;
  83.             break;
  84.         }
  85.     }
  86.     if (!t)
  87.     {
  88.         printf("OK");
  89.     }
  90.     free(arr);
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment