Advertisement
Guest User

Untitled

a guest
Nov 25th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // Функция "просеивания" через кучу - формирование кучи
  4. void siftDown(int *numbers, int root, int bottom)
  5. {
  6.   int maxChild; // индекс максимального потомка
  7.   int done = 0; // флаг того, что куча сформирована
  8.   // Пока не дошли до последнего ряда
  9.   while ((root * 2 <= bottom) && (!done))
  10.   {
  11.     if (root * 2 == bottom)    // если мы в последнем ряду,
  12.       maxChild = root * 2;    // запоминаем левый потомок
  13.     // иначе запоминаем больший потомок из двух
  14.     else if (numbers[root * 2] > numbers[root * 2 + 1])
  15.       maxChild = root * 2;
  16.     else
  17.       maxChild = root * 2 + 1;
  18.     // если элемент вершины меньше максимального потомка
  19.     if (numbers[root] < numbers[maxChild])
  20.     {
  21.       int temp = numbers[root]; // меняем их местами
  22.       numbers[root] = numbers[maxChild];
  23.       numbers[maxChild] = temp;
  24.       root = maxChild;
  25.     }
  26.     else // иначе
  27.       done = 1; // пирамида сформирована
  28.   }
  29. }
  30. // Функция сортировки на куче
  31. void heapSort(int *numbers, int array_size)
  32. {
  33.   // Формируем нижний ряд пирамиды
  34.   for (int i = (array_size / 2) - 1; i >= 0; i--)
  35.     siftDown(numbers, i, array_size);
  36.   // Просеиваем через пирамиду остальные элементы
  37.   for (int i = array_size - 1; i >= 1; i--)
  38.   {
  39. //меняем элементы местами
  40.     int temp = numbers[0];
  41.     numbers[0] = numbers[i];
  42.     numbers[i] = temp;
  43. //вызов функции просеивающей через кучу уже без i-го элемента
  44.     siftDown(numbers, 0, i - 1);
  45.   }
  46. }
  47. int main()
  48. {
  49.   int a[100];
  50.  
  51.   int i=0;
  52.   // Заполнение массива введеннымичислами
  53.   printf("Введите ваши числа\n");
  54.  
  55.   while (scanf("%d", &a[i])==1)
  56.     i++;
  57.  
  58.   // Вывод элементов массива до сортировки
  59.   for (int j = 0; j<i; j++)
  60.     printf("%d ", a[j]);
  61.   printf("\n");
  62.   heapSort(a, i); // вызов функции сортировки
  63.   // Вывод элементов массива после сортировки
  64.   for (int j = 0; j<i; j++)
  65.     printf("%d ", a[j]);
  66.   printf("\n");
  67.   getchar();
  68.   return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement