Сортировка массива по возрастанию или убыванию - C (СИ)

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

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

Дан одномерный массив состоящий из N целых элементов. Осуществить хип сорт по возрастанию или убыванию. P.s. как можно больше комментариев)))

Решение задачи: «Сортировка массива по возрастанию или убыванию»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void Print(int*, int);
  6.  
  7. //----------------------------------------------//
  8. void DownHeap(int heap[], int i, int n)
  9. {
  10.    //Просеивает элемент номер i вниз в пирамиде heap.
  11.    //n -- размер пирамиды
  12.  
  13.    //Идея в том, что вычисляется максимальный элемент из трёх:
  14.    //  1) текущий элемент
  15.    //  2) левый потомок
  16.    //  3) правый потомок
  17.    //Если индекс текущего элемента не равен индексу максималь-
  18.    //  ного, то меняю их местами, и перехожу к максимальному
  19.  
  20.    //Индекс максимального элемента в текущей тройке элементов:
  21.    int max = i;
  22.    //Значение текущего элемента (не меняется):
  23.    int const value = heap[i];
  24.  
  25.    while (1)
  26.    {
  27.       //Рассматривается элемент i и его потомки i*2+1 и i*2+2
  28.       //В начале каждой итерации max == i и value == heap[i]
  29.  
  30.       int child = (i * 2) + 1; //Индекс левого потомка
  31.       //Если есть левый потомок и он больше текущего элемента,
  32.       if ((child < n) && (heap[child] > value))
  33.       {
  34.          max = child; //  то он считается максимальным
  35.       }
  36.  
  37.       ++child; //Индекс правого потомка
  38.       //Если есть правый потомок и он больше максимального,
  39.       if ((child < n) && (heap[child] > heap[max]))
  40.       {
  41.          max = child; //  то он считается максимальным
  42.       }
  43.       //Если текущий элемент является максимальным из трёх
  44.       //  (т.е. если он больше своих детей), то конец:
  45.       if (max == i)
  46.       {
  47.          break;
  48.       }
  49.  
  50.       //Меняю местами текущий элемент с максимальным:
  51.       heap[i] = heap[max];
  52.       heap[max] = value;
  53.       //  при этом значение value будет в ячейке max,
  54.       //  поэтому в начале следующей итерации значение value
  55.       //  правильно, т.к. мы переходим именно к этой ячейке
  56.  
  57.       //Переходим к изменившемуся потомку
  58.       i = max;
  59.    }
  60. }
  61. //----------------------------------------------//
  62. void HeapSort(int heap[], int n)
  63. {
  64.    //Пирамидальная сортировка массива heap.
  65.    //  n -- размер массива
  66.    int i;
  67.    //Этап 1: построение пирамиды из массива
  68.    for (i = n / 2 - 1; i >= 0; --i)
  69.    {
  70.       DownHeap(heap, i, n);
  71.    }
  72.  
  73.    //Этап 2: сортировка с помощью пирамиды.
  74.    //  Здесь под «n» понимается размер пирамиды
  75.    while (n > 1)  //Пока в пирамиде больше одного элемента
  76.    {
  77.       --n; //Отделяю последний элемент
  78.  
  79.       //Меняю местами корневой элемент и отделённый:
  80.       int tmp = heap[0];
  81.       heap[0] = heap[n];
  82.       heap[n] = tmp;
  83.  
  84.       //Просеиваю новый корневой элемент:
  85.       DownHeap(heap, 0, n);
  86.    }
  87. }
  88. //----------------------------------------------//
  89. void Random(int* a, int n)
  90. {
  91.    int i;
  92.    for (i = 0; i < n; i++)
  93.    {
  94.       a[i] = rand() % (n * 2);
  95.    }
  96. }
  97. //----------------------------------------------//
  98. void Print(int* a, int n)
  99. {
  100.    int i;
  101.    for (i = 0; i < n; i++)
  102.    {
  103.       printf("%3d ", a[i]);
  104.    }
  105.    printf("\n");
  106. }
  107. //----------------------------------------------//
  108. int main(int argc, char** argv)
  109. {
  110.    srand(time(NULL));
  111.  
  112.    int* a = NULL;
  113.    int n;
  114.  
  115.    printf("n: ");
  116.    scanf("%d", &n);
  117.    a = malloc(sizeof(int) * n);
  118.  
  119.    Random(a, n);
  120.  
  121.    Print(a, n);
  122.  
  123.    HeapSort(a, n);
  124.  
  125.    Print(a, n);
  126.  
  127.    return 0;
  128. }

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


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

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

10   голосов , оценка 3.8 из 5

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

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

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