Advertisement
Guest User

hsort

a guest
Feb 20th, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int compare(const void* aa, const void* bb) {
  6.         int n1 = strlen((char*)aa), n2 = strlen((char*)bb), count1 = 0, count2 = 0;
  7.         const char *a = aa, *b = bb;
  8.         int i = 0;
  9.         while (a[i] != 0) {
  10.                 if (a[i] == 'a') count1++;
  11.                 i++;
  12.         }
  13.         i = 0;
  14.         while (b[i] != 0) {
  15.                 if (b[i] == 'a') count2++;
  16.                 i++;
  17.         }
  18.         if (count1 < count2) return -1;
  19.         else return 1;
  20. }
  21.  
  22. void swap(void* aa, void* bb, size_t width) {
  23.   char* a = ((char*)aa), * b = ((char*)bb);
  24.   for (int i = 0; i < width; i++) {
  25.     int t = a[i];
  26.     a[i] = b[i];
  27.     b[i] = t;
  28.   }
  29. }
  30.  
  31. void heapify(void* base, size_t nel, int i, int (*compare)(const void* a, const void* b), size_t width) {
  32.         int m = 1;
  33.         while (m == 1) {
  34.                 int l = 2 * i + 1;
  35.                 int r = l + 1;
  36.                 int j = i;
  37.                 if ((l < nel) && (compare((base + width * i), (base + width * l)) == -1)) {
  38.                         i = l;
  39.                 }
  40.                 if ((r < nel) && (compare((base + width * i), (base + width * r)) == -1)) {
  41.                         i = r;
  42.                 }
  43.                 if (i == j) break;
  44.                 swap((base + width * i), (base + width * j), width);
  45.         }
  46. }
  47.  
  48. void buildheap(void* base, size_t nel, int (*compare)(const void* a, const void* b), size_t width) {
  49.         int i = (nel / 2) - 1;
  50.         while (i >= 0) {
  51.           heapify(base, nel, i, compare, width);
  52.           i -= 1;
  53.         }
  54. }
  55.  
  56. void hsort(void* base, size_t nel, size_t width, int (*compare)(const void* a, const void* b)) {
  57.         buildheap(base, nel, compare, width);
  58.         int i = nel - 1;
  59.         while (i > 0) {
  60.                 swap(base, (base + i * width), width);
  61.                 heapify(base, i, 0, compare, width);
  62.                 i -= 1;
  63.         }
  64. }
  65.  
  66. int main() {
  67.         int n;
  68.         scanf("%d ", &n);
  69.         char base[n][100];
  70.         for (int i = 0; i < n; i++) gets(base[i]);
  71.         hsort(base, n, 100, compare);
  72.         for (int i = 0; i < n; i++) printf("%s\n", base[i]);
  73.         return 0;
  74. }
  75.  
  76. ____________________________________________________________________________________________________________________________
  77.  
  78. Пирамидальная сортировка
  79.  
  80. Составьте функцию hsort, выполняющую пирамидальную сортировку произвольного массива. Объявление функции hsort должно быть выполнено по аналогии с функцией qsort:
  81. void hsort(void *base, size_t nel, size_t width,
  82.         int (*compare)(const void *a, const void *b))
  83. {
  84.         ...
  85. }
  86. В качестве параметров функция hsort принимает указатель на начало массива base, количество элементов массива nel, размер одного элемента width и указатель на функцию сравнения compare.
  87. Итоговая программа heapsort.c должна сортировать массив строк в порядке возрастания количества букв a в строке. Программа должна считывать из стандартного потока ввода размер и элементы массива, и выводить в стандартный поток вывода результат сортировки.
  88. Примеры работы программы:
  89.  
  90. Ввод:
  91. 3
  92. abac
  93. asdf
  94. aaaaa
  95. Вывод:
  96. asdf
  97. abac
  98. aaaaa
  99.  
  100. Ввод:
  101. 4
  102. abracadabra
  103. qwerty
  104. abba
  105. a
  106. Вывод:
  107. qwerty
  108. a
  109. abba
  110. abracadabra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement