Пирамидальная сортировка
Сортировка:
1. Быстрая сортировка (англ. quicksort)
2. Сортировка Шелла (англ. Shell sort)
Поиск:
1. Прямой поиск (он же Простой, он же Алгоритм грубой силы)
2. Алгоритм Бойера-Мура-Хорспула
И новенькое:
Пирамидальная сортировка
Данный вид сортировки основан на логическом представлении исходного массива в виде паримиды. Номер элемента в пирамиде вычисляется как 2n+1 и 2n+2 для потомков (n – номер родителя) и (n-1)/2 для родителя (n – номер потомка). Нумерация в пирамиде ведется с нуля.
Алгоритм:
1. Построение пирамиды – проверка условия пирамидальности - каждый родитель должен быть больше своего потомка.
2. Сортировка пирамиды.
а) Поменять местами значения первого и последнего узлов пирамиды;
б) Отделить последний узел от дерева, уменьшив размер дерева на единицу (элемент остаётся в массиве);
в) Восстановить пирамиду, просеяв вниз её новый корневой элемент;
г) Перейти к пункту (а);
Боевой пример:
void DownHeap(int Arr[], int index, int Count, int Current)
{
//Функция пробегает по пирамиде восстанавливая ее
//Также используется для изначального создания пирамиды
//Использование: Передать номер следующего элемента в index
//Процедура пробежит по всем потомкам и найдет нужное место для следующего элемента
int Child;
while (index < (Count/2))
{
Child = (index+1)*2-1;
if ((Child < Count-1) && (Arr[Child] < Arr[Child+1])) Child++;
if (Current >= Arr[Child]) break;
Arr[index] = Arr[Child];
index = Child;
}
Arr[index] = Current;
}
void heapSort(int Arr[], int Count)
{
//Основная функция
int i;
int Current;
//Собираем пирамиду
for (i = (Count/2)-1; i >= 0; i--) DownHeap(Arr, i, Count, Arr[i]);
//Пирамида собрана. Теперь сортируем
for (i = Count-1; i > 0; i--)
{
Current = Arr[i]; //перемещаем верхушку в начало отсортированного списка
Arr[i] = Arr[0];
DownHeap(Arr, 0, i, Current); //находим нужное место в пирамиде для нового элемента
}
}
Код переписан и отлажен совместно с Di
Спасибо за указание на ошибку Barin
Ноябрь 15th, 2019 - 13:40
ошибка в условии: for (i = (Count/2)-1; i > 0; i—) DownHeap(Arr, i, Count, Arr[i]);
ошибка в условии: for (i = Count-1; i > 0; i—)
правильно: i >= 0 (в C++ массивы начинаются с индекса 0, при строгом неравенстве мы пропустим элемент с этим индексом)
Ноябрь 15th, 2019 - 15:19
Да, проверил, про первое условие — правда. Статью исправил
Src: 2 5 6 1 0 7 9 22 0 54
Sort: 0 0 1 5 6 7 9 22 54 2
А вот про второе услови — не уверен, не влияет оно на результат сортировки, т.к. в самом цикле мы уже работаем с индексом 0.
Есть тестовые данные, на которых второе условие неправильно работает?