[Все сортировки]
Теория: читаем дивную статью с картинками
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
Реализация:
Общую логику программы можно отследить по этому фрагменту кода:
- // просейка вверх узла с индексом pos
- void shiftUp(vector<int> &mas, int pos)
- {
- while (!isRoot(pos) && mas[pos]>mas[Parent(pos)])
- {
- swap(mas[pos],mas[Parent(pos)]);
- pos = Parent(pos);
- }
- }
- // просейка вниз узла с индексом pos
- void shiftDown(vector<int> &mas, int pos, int n)
- {
- while (!isList(pos,n))
- {
- int posMaxChild = Left(pos);
- if (isRightExist(pos,n))
- {
- if (mas[Left(pos)] < mas[Right(pos)])
- posMaxChild = Right(pos);
- }
- if (mas[pos]<mas[posMaxChild])
- {
- swap(mas[pos],mas[posMaxChild]);
- pos = posMaxChild;
- }
- else
- break;
- }
- }
- // преобразовать входной массив в кучу
- void make_heap(vector<int> &mas)
- {
- for (int i=1;i<mas.size();i++)
- shiftUp(mas,i);
- }
- // упорядочивание входного массива пирамидальной сортировкой
- void heap_sort(vector<int> &mas)
- {
- make_heap(mas);
- int size = mas.size();
- for (int i=0;i<mas.size();i++)
- {
- swap(mas[0],mas[size-1]);
- size--;
- shiftDown(mas,0,size);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Полный исходник глядим здесь Для учебных целей можно рассмотреть рекурсивную, более понятную запись функций shiftDown и shiftUp:
- // просейка вверх
- void shiftUp(vector<int> &mas, int pos)
- {
- if (isRoot(pos))
- return;
- if (mas[Parent(pos)] < mas[pos])
- {
- swap(mas[Parent(pos)],mas[pos]);
- shiftUp(mas,Parent(pos));
- }
- }
- // просейка вниз
- void shiftDown(vector<int> &mas, int pos, int n)
- {
- if (isList(pos,n))
- return;
- int posMaxChild = Left(pos);
- if (isRightExist(pos,n))
- {
- if (mas[Left(pos)] < mas[Right(pos)])
- posMaxChild = Right(pos);
- }
- if (mas[pos]<mas[posMaxChild])
- {
- swap(mas[pos],mas[posMaxChild]);
- shiftDown(mas, posMaxChild,n);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Комментариев нет:
Отправить комментарий