Advertisement
Guest User

Untitled

a guest
May 24th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. void siftDown(int *arr, int root, int bottom)
  2. {
  3. int maxChild; // индекс максимального потомка
  4. int done = 0; // флаг того, что куча сформирована
  5. // пока не дошли до последнего ряда
  6. while ((root * 2 <= bottom) && (!done))
  7. {
  8.  
  9. if (root * 2 == bottom) // если мы в последнем ряду,
  10. maxChild = root * 2; // запоминаем левый потомок
  11. // иначе запоминаем больший потомок из двух
  12. else if (arr[root * 2] > arr[root * 2 + 1])
  13. maxChild = root * 2;
  14. else
  15. maxChild = root * 2 + 1;
  16. // если элемент вершины меньше максимального потомка
  17. if (arr[root] < arr[maxChild])
  18. {
  19. int temp = arr[root]; // меняем их местами
  20. arr[root] = arr[maxChild];
  21. arr[maxChild] = temp;
  22. root = maxChild;
  23. }
  24. else
  25. done = 1; // пирамида сформирована
  26. }
  27. }
  28.  
  29. int* heapsort(int* a, size_t len)
  30. {
  31.  
  32. // копируем массив - будем сортировать его копию
  33. int* arr = copy_array(a, len);
  34.  
  35. // формируем нижний ряд пирамиды
  36. for (int i = (len / 2) - 1; i >= 0; i--)
  37. {
  38. siftDown(arr, i, len - 1);
  39. }
  40. // просеиваем через пирамиду остальные элементы
  41. for (int i = len - 1; i >= 1; i--)
  42. {
  43. int temp = arr[0];
  44. arr[0] = arr[i];
  45. arr[i] = temp;
  46. siftDown(arr, 0, i - 1);
  47. }
  48. return arr;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement