مرتبسازی هرمی (Heap Sort) یکی از روشهای مشهور مرتبسازی دادهها است که بر اساس خصوصیات درخت heap (هیپ، هرم یا کپه) و عملکرد آن پیادهسازی شده است.
بر اساس تعریف درخت heap، در یک max-heap (یا min-heap) بزرگترین (یا کوچکترین) مقدار بین دادهها همواره در ریشه درخت قرار دارد. یافتن بزرگترین (یا کوچکترین) عنصر بین عناصر، هزینه ثابت ( Ө( 1 دارد. با حذف این عنصر از درخت، بزرگترین (یا کوچکترین) عنصر بعدی مجددا در ریشه قرار میگیرد. به این ترتیب با حذف متوالی عناصر درخت heap و درج آنها در محل جدید، یک آرایه مرتبشده نزولی (یا صعودی) به دست خواهد آمد.
به عنوان نمونه، min-heap زیر را در نظر بگیرید:
مراحل مرتبسازی هرمی به ترتیب زیر خواهد بود:
Step 0 ) min-heap: 1, 4, 5, 8, 6, 9 - list:
Step 1 ) min-heap: 4, 6, 5, 8, 9 - list: 1
Step 2 ) min-heap: 5, 6, 9, 8 - list: 1, 4
Step 3 ) min-heap: 6, 8, 9 - list: 1, 4, 5
Step 4 ) min-heap: 8, 9 - list: 1, 4, 5, 6
Step 5 ) min-heap: 9 - list: 1, 4, 5, 6, 8
Step 6 ) min-heap: - list: 1, 4, 5, 6, 8, 9
در پایان، آرایه list شامل اطلاعات مرتبشده صعودی است.
بررسی پیچیدگی زمانی مرتبسازی هرمی
[برگرد بالا]
برای مرتبکردن عناصر با استفاده از درخت heap، نیاز به n عمل حذف گره ریشه از درخت (یا عمل pop) وجود دارد. عمل حذف گره ریشه در درخت heap خود از مرتبه ( Θ( log n است. در نتیجه کل این عملیات از مرتبه ( Θ( n log n خواهد بود.
نکته قابل توجه دیگر، ساخت درخت heap از عناصر مورد نظر برای مرتبسازی است. در حالت عادی عناصر به صورت نامرتب و با چیدمان تصادفی در اختیار هر الگوریتم مرتبسازی قرار میگیرند. در این حالت یک هزینه زمانی دیگر برای ساخت درخت heap از روی چنین لیستی مورد نیاز است.
بررسی فضای مصرفی مرتبسازی هرمی
[برگرد بالا]
در روش بحث شده برای مرتب کردن n عنصر، دو آرایه n عنصری نیاز است. یکی از این آرایهها عناصر را به فرم درخت heap به عنوان ورودی الگوریتم و دیگری عناصر مرتب شده را به عنوان خروجی الگوریتم شامل میشوند. در چنین حالتی این الگوریتم یک روش مرتبسازی درجا نیست. با اندکی تغییر در روش پیادهسازی الگوریتم میتوان عملکرد دو آرایه را در یک آرایه ادغام کرده و میزان حافظه مصرفی را کاهش داد.
درخت min-heap مثال فوق را در نظر بگیرید. با حذف عدد یک به عنوان گره ریشه درخت و اعمال تغییرات لازم به نتیجه زیر میرسیم:
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان میدهد. خانه شماره 6 حاوی اطلاعات سوخته و بلا استفاده است. پس میتوانیم عنصر حذف شده را در آن قرار دهیم:
توجه داشته باشید که در حال حاضر درخت از پنج عنصر تشکیل شده است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار 4 آرایه زیر حاصل میشود:
و با درج عنصر حذف شده در محل بلا استفاده:
به همین ترتیب با تکرار الگوریتم نتیجه نهایی حاصل میشود:
البته توجه داشته باشید که بر خلاف نتیجه نهایی روش قبل، در این حالت عناصر به صورت نزولی به دست آمدهاند. یعنی در این روش از درخت min-heap برای مرتبسازی نزولی و از درخت max-heap برای مرتبسازی صعودی استفاده میشود.