Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int compare(const void* aa, const void* bb) {
- int n1 = strlen((char*)aa), n2 = strlen((char*)bb), count1 = 0, count2 = 0;
- const char *a = aa, *b = bb;
- int i = 0;
- while (a[i] != 0) {
- if (a[i] == 'a') count1++;
- i++;
- }
- i = 0;
- while (b[i] != 0) {
- if (b[i] == 'a') count2++;
- i++;
- }
- if (count1 < count2) return -1;
- else return 1;
- }
- void swap(void* aa, void* bb, size_t width) {
- char* a = ((char*)aa), * b = ((char*)bb);
- for (int i = 0; i < width; i++) {
- int t = a[i];
- a[i] = b[i];
- b[i] = t;
- }
- }
- void heapify(void* base, size_t nel, int i, int (*compare)(const void* a, const void* b), size_t width) {
- int m = 1;
- while (m == 1) {
- int l = 2 * i + 1;
- int r = l + 1;
- int j = i;
- if ((l < nel) && (compare((base + width * i), (base + width * l)) == -1)) {
- i = l;
- }
- if ((r < nel) && (compare((base + width * i), (base + width * r)) == -1)) {
- i = r;
- }
- if (i == j) break;
- swap((base + width * i), (base + width * j), width);
- }
- }
- void buildheap(void* base, size_t nel, int (*compare)(const void* a, const void* b), size_t width) {
- int i = (nel / 2) - 1;
- while (i >= 0) {
- heapify(base, nel, i, compare, width);
- i -= 1;
- }
- }
- void hsort(void* base, size_t nel, size_t width, int (*compare)(const void* a, const void* b)) {
- buildheap(base, nel, compare, width);
- int i = nel - 1;
- while (i > 0) {
- swap(base, (base + i * width), width);
- heapify(base, i, 0, compare, width);
- i -= 1;
- }
- }
- int main() {
- int n;
- scanf("%d ", &n);
- char base[n][100];
- for (int i = 0; i < n; i++) gets(base[i]);
- hsort(base, n, 100, compare);
- for (int i = 0; i < n; i++) printf("%s\n", base[i]);
- return 0;
- }
- ____________________________________________________________________________________________________________________________
- Пирамидальная сортировка
- Составьте функцию hsort, выполняющую пирамидальную сортировку произвольного массива. Объявление функции hsort должно быть выполнено по аналогии с функцией qsort:
- void hsort(void *base, size_t nel, size_t width,
- int (*compare)(const void *a, const void *b))
- {
- ...
- }
- В качестве параметров функция hsort принимает указатель на начало массива base, количество элементов массива nel, размер одного элемента width и указатель на функцию сравнения compare.
- Итоговая программа heapsort.c должна сортировать массив строк в порядке возрастания количества букв a в строке. Программа должна считывать из стандартного потока ввода размер и элементы массива, и выводить в стандартный поток вывода результат сортировки.
- Примеры работы программы:
- Ввод:
- 3
- abac
- asdf
- aaaaa
- Вывод:
- asdf
- abac
- aaaaa
- Ввод:
- 4
- abracadabra
- qwerty
- abba
- a
- Вывод:
- qwerty
- a
- abba
- abracadabra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement