Сортування двійковим деревом — Вікіпедія

Сортування двійковим деревом
Binary tree sort(2)
Клас Алгоритм сортування
Структура даних Масив
Найгірша швидкодія
Найкраща швидкодія
Середня швидкодія
Просторова складність у найгіршому випадку

Сортування двійковим (бінарним) деревом (сортування з допомогою двійкового дерева, англ. tree sort) — алгоритм сортування, що полягає в побудові двійкового дерева пошуку за ключами масиву, а далі, в створенні результуючого масиву впорядокованих елементів виконуючи обхід дерева.

Алгоритм[ред. | ред. код]

  1. Отримати елементи вхідного масиву.
  2. Побудувати двійкове дерево вставляючи елементи вхідного масиву в двійкове дерево пошуку.
  3. Виконати обхід дерева, щоб отримати результуючий масив з впорядкованими елементами.

Аналіз[ред. | ред. код]

Швидкодія[ред. | ред. код]

Процедура додавання об'єкта в збалансоване дерево має середню алгоритмічну складність . Відповідно, для n об'єктів складність буде дорівнювати .

Однак, складність додавання об'єкта в незбалансоване дерево може досягати , що може збільшити загальну алгоритмічну складність до .

Реалізація[ред. | ред. код]

C++[ред. | ред. код]

#include <iostream> #include <vector>  using namespace std;  struct Node {     int data;     struct Node *left, *right; };  struct Node *newnode(int key) {     struct Node *temp = new Node;     temp->data = key;     temp->left = NULL;     temp->right = NULL;     return temp; }  Node* insert(Node *node, int key) {     if (node == NULL) {         return newnode(key);     }     if (key < node->data) {         node->left = insert(node->left, key);     }     else {         node->right = insert(node->right, key);     }     return node; }  void store(Node *root, int a[], int &i) {     if (root != NULL)     {         store(root->left, a, i);         a[i++] = root->data;         store(root->right, a, i);     } }  void TreeSort(vector<int>& a) {     struct Node *root = NULL;     root = insert(root, a[0]);     for (size_t i = 1; i < a.size(); ++i) {         insert(root, a[i]);     }     int i = 0;     store(root, a.data(), i); }  int main() {      vector<int> a{1,6,8,3,10,2,12};     TreeSort(a);      cout << "The sorted array is:\n";     for (size_t i = 0; i < a.size(); ++i) {         cout << a[i] << " ";     }     cout << endl;          return 0; } 

Переваги та недоліки алгоритму[ред. | ред. код]

Переваги[ред. | ред. код]

  • Основною перевагою алгоритму сортування двійковим деревом є те, що ми легко можемо робити зміни, як у зв'язаному списку.
  • Сортування двійковим деревом відбувається так само швидко, як алгоритм швидкого сортування.

Недоліки[ред. | ред. код]

  • Найгірший випадок сортування — коли всі елементи масиву вже відсортовані.
  • У гіршому випадку, час роботи алгоритму дорівнює .

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]

Посилання[ред. | ред. код]