Сортування двійковим деревом
Сортування двійковим (бінарним) деревом (сортування з допомогою двійкового дерева, англ. tree sort) — алгоритм сортування, що полягає в побудові двійкового дерева пошуку за ключами масиву, а далі, в створенні результуючого масиву впорядокованих елементів виконуючи обхід дерева.
Клас | Алгоритм сортування |
---|---|
Структура даних | Масив |
Найгірша швидкодія | |
Найкраща швидкодія | |
Середня швидкодія | |
Просторова складність у найгіршому випадку |
Алгоритм
- Отримати елементи вхідного масиву.
- Побудувати двійкове дерево вставляючи елементи вхідного масиву в двійкове дерево пошуку.
- Виконати обхід дерева, щоб отримати результуючий масив з впорядкованими елементами.
Аналіз
Швидкодія
Процедура додавання об'єкта в збалансоване дерево має середню алгоритмічну складність . Відповідно, для 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;
}
Переваги та недоліки алгоритму
Переваги
- Основною перевагою алгоритму сортування двійковим деревом є те, що ми легко можемо робити зміни, як у зв'язаному списку.
- Сортування двійковим деревом відбувається так само швидко, як алгоритм швидкого сортування.
Недоліки
- Найгірший випадок сортування — коли всі елементи масиву вже відсортовані.
- У гіршому випадку, час роботи алгоритму дорівнює .
Джерела
- Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein. Introduction to Algorithms (2nd ed.) The MIT Press. ISBN 0-07-013151-1
- Tree sort algorithm
- Big-O Algorithm Complexity
Посилання
- Tree sort in C++
- GeeksforGeeks: Tree sort
- Алгоритми і Структури
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.