Все элементы встречаются только один раз - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана последовательность из n целых элементов. Сформировать новую последовательность, в которой все элементы исходной последовательности встречаются только один раз. В результирующей последовательности элементы должны быть отсортированы по убыванию. Все последовательности: исходную и полученную вывести на экран

Решение задачи: «Все элементы встречаются только один раз»

textual
Листинг программы
  1. #include <stdio.h>
  2. void hsort_heapify(int i, int a[], int n, int (*cmp)(int, int));
  3. void hsort(int a[], int n, int (*cmp)(int, int));
  4. int  array_unique(int a[], int n);
  5.  
  6. //компаратор для сортировки по убыванию
  7. int compare(int a, int b) { return (a > b); }
  8.  
  9. int main(void){
  10.     int i;
  11.     int a[] = { 1, 8, 3, 7, 5, 6, 9, 3, 4, 1, 2, 7, 8, 4, 1, 6, 0 };
  12.     int n   = sizeof(a)/sizeof(a[0]);
  13.  
  14.     for(i = 0; i < n; ++i)
  15.         printf("%d ", a[i]);
  16.     putchar('\n');
  17.    
  18.     hsort(a, n, &compare);
  19.     n = array_unique(a, n);
  20.  
  21.     for(i = 0; i < n; ++i)
  22.         printf("%d ", a[i]);
  23.     putchar('\n');
  24.  
  25.     getchar();
  26.     return 0;
  27. }
  28.  
  29. //пирамидальная сортировка на базе бинарной куче
  30. void hsort(int a[], int n, int (*cmp)(int, int)){
  31.     int i, t;
  32.     for(i = n >> 1; i >= 0; --i)
  33.         hsort_heapify(i, a, n, cmp);
  34.    
  35.     for(i = n - 1; i >= 0; --i){
  36.         t    = a[0];
  37.         a[0] = a[i];
  38.         a[i] = t;
  39.         hsort_heapify(0, a, i, cmp);
  40.     }
  41. }
  42.  
  43. //удаление дубликатов
  44. int array_unique(int a[], int n){
  45.     int i, j = n - 1;
  46.     for(i = 0; i < j; ++i){
  47.         if(a[i] == a[i + 1])
  48.             break;
  49.     }
  50.  
  51.     for(j = i; i < (n - 1); a[i] = a[j]){
  52.         if(a[j] != a[j + 1])
  53.             ++i;
  54.         else
  55.             --n;
  56.         ++j;
  57.     }
  58.     return n;
  59. }
  60.  
  61. //восстановление свойства бинарной кучи
  62. void hsort_heapify(int i, int a[], int n, int (*cmp)(int, int)){
  63.     int li, ri, b, t;
  64.  
  65.     while(1){
  66.         li = (i << 1) + 1;
  67.         ri = li + 1;
  68.         if((li < n) && (*cmp)(a[i], a[li]))
  69.             b = li;
  70.         else
  71.             b = i;
  72.  
  73.         if((ri < n) && (*cmp)(a[b], a[ri]))
  74.             b = ri;
  75.  
  76.         if(b != i) {
  77.             t    = a[b];
  78.             a[b] = a[i];
  79.             a[i] = t;
  80.             i = b;
  81.         } else
  82.             break;
  83.     }
  84. }

Объяснение кода листинга программы

В данном коде реализована сортировка массива методом пирамидальной сортировки на базе бинарной кучи и удаление дубликатов. Список действий:

  1. В функции main создается массив a с некоторыми значениями.
  2. С помощью цикла for элементы массива выводятся на экран.
  3. Затем вызывается функция hsort, которая сортирует массив методом пирамидальной сортировки на базе бинарной кучи. В качестве аргументов функции передается сам массив, его размер и функция сравнения compare, которая сравнивает элементы массива по убыванию.
  4. После сортировки вызывается функция array_unique, которая удаляет дубликаты из отсортированного массива.
  5. С помощью цикла for элементы массива выводятся на экран.
  6. В конце программы вызывается функция getchar для ожидания нажатия клавиши и возвращается 0, что означает успешное завершение программы. В функции hsort используется рекурсивный алгоритм пирамидальной сортировки на базе бинарной кучи. Список действий:
  7. Переменная i инициализируется значением n >> 1, где n - размер массива.
  8. В цикле for выполняется сортировка массива методом пирамидальной сортировки на базе бинарной кучи.
  9. Затем в цикле for элементы массива переупорядочиваются таким образом, чтобы они были в нужном порядке. В функции array_unique используется алгоритм удаления дубликатов из массива. Список действий:
  10. Переменные i и j инициализируются значениями 0 и n - 1 соответственно.
  11. В цикле for происходит сравнение элементов массива и если текущий элемент равен следующему, то цикл прерывается.
  12. Затем в цикле for элементы массива переупорядочиваются таким образом, чтобы дубликаты были удалены. В функции hsort_heapify реализуется восстановление свойства бинарной кучи. Список действий:
  13. Переменные li, ri, b, t инициализируются значениями, соответствующими позиции текущего элемента.
  14. Затем в цикле while происходит поиск элемента, который нужно поменять местами с текущим элементом, чтобы восстановить свойство бинарной кучи.
  15. Если такой элемент найден, то он меняется местами с текущим элементом, а переменная i присваивается новое значение, соответствующее позиции найденного элемента.
  16. В конце цикла while выполняется проверка, был ли произведен обмен элементами. Если нет, то свойство бинарной кучи уже восстановлено и цикл прерывается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы