رده | الگوریتم مرتبسازی |
---|---|
ساختمان داده | آرایه |
کارایی بدترین حالت | (نامتوازن)، (متوازن) |
کارایی بهترین حالت | (نامتوازن)، (متوازن) |
کارایی متوسط | |
پیچیدگی فضایی |
مرتبسازی درختی یک الگوریتم مرتبسازی میباشد که یک درخت جستجوی دودویی از کلیدهایی که باید مرتب شوند میسازد و آنگاه با پیمایش میان ترتیب درخت کلیدهای مرتب شده را بهدست میآوریم.
معمولاً هنگامی از مرتبسازی درختی استفاده میشود که هدف مرتبسازی یک رشته ورودی از یک فایل باشد. در اغلب الگوریتمهای مرتبسازی دادهها باید در یک ساختمان داده موقت ذخیره شوند و سپس عملیات مرتبسازی بر روی آن انجام شود. درحالیکه در مرتبسازی درختی بارگذاری یک عنصر در ساختمان داده بر مرتبسازی آن است.
درج یک عنصر در یک درخت جستجوی دودویی به طور میانگین از مرتبه((O(log(n است.[۱] بنابراین ساخت یک درخت جستجوی دودویی با n عضو از مرتبه((O(n log(n میباشد که یک درخت جستجو میسازدو همچنین یک مرتبسازی بهینه است.
اضافه کردن ک عنصر جدید به یک درخت جستجوی دودویی از(O(n زمان میبرد. یعنی هنگامی که درخت شبیه به یک لیست پیوندی ساده میشود باعث میشود که در بدترین حالت این الگوریتم از مرتبه (O(n۲ زمان میبرد.
البته با استفاده از گسترشهایی از درخت دودویی جستجو میتوان رفتار بدترین حالت را بهبود داد و در بدترین حالت هم از((O(n log(n باشد. پس مرتبسازی درختی به لحاظ تئوری هم بهینه است.
غالب پردازش در یک مرتبسازی درختی درج در درخت دودویی است با فرض اینکه زمان بازیابی اطلاعات (O(n باشد.
در زیر تکه برنامه سی پلاس پلاس را آوردهایم.
multiset کلاسی در سی پلاس پلاس میباشد که در حقیقت یک درخت جستجوی دودویی خاص میباشد که این امکان را فراهم میسازد که در بدترین حالت هم درج بهینه در این داده ساختار از ((O(log(n داشته باشیم.
#include <set> // for multiset
#include <algorithm> // for copy
#include <iterator> // for iterator_traits
template <typename Iterator>
void binary_tree_sort(Iterator begin, Iterator end)
{
// C++'s multiset class is a self-balancing binary search tree that allows duplicates
// Add each element in input range to the tree
std::multiset<typename std::iterator_traits<Iterator>::value_type> tree(begin, end);
// Read elements in ascending order by simply traversing the tree.
std::copy(tree.begin(), tree.end(), begin);
}