مرتب‌سازی هرمی

بررسی پیچیدگی زمانی مرتب‌سازی هرمی

برای مرتب‌کردن عناصر با استفاده از درخت heap، نیاز به n عمل حذف گره ریشه از درخت دارد. عمل حذف گره ریشه در درخت heap خود از مرتبه (Θ(log n است. در نتیجه کل این عملیات از مرتبه (Θ(n log n خواهد بود.
نکته قابل توجه دیگر، ساخت درخت heap از عناصر مورد نظر برای مرتب‌سازی است. در حالت عادی عناصر به صورت نامرتب و با چیدمان تصادفی در اختیار هر الگوریتم مرتب‌سازی قرار می‌گیرند. در این حالت یک هزینه زمانی دیگر برای ساخت درخت heap از روی چنین فهرستی مورد نیاز است.

بررسی فضای مصرفی مرتب‌سازی هرمی

در روش بحث شده برای مرتب کردن n عنصر، دو آرایه n عنصری نیاز است. یکی از این آرایه‌ها عناصر را به فرم درخت heap به عنوان ورودی الگوریتم، و دیگری عناصر مرتب شده را به عنوان خروجی الگوریتم شامل می‌شوند. در چنین حالتی این الگوریتم یک روش مرتب‌سازی درجا نیست. با اندکی تغییر در روش پیاده‌سازی الگوریتم می‌توان عملکرد دو آرایه را در یک آرایه ادغام کرده، و میزان حافظه مصرفی را کاهش داد.
درخت min-heap مثال فوق را در نظر بگیرید. با حذف عدد یک به عنوان گره ریشه درخت و اعمال تغییرات لازم به نتیجه زیر می‌رسیم:
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان می‌دهد. خانه شماره ۶ حاوی اطلاعات بلا استفاده‌است. پس می‌توانیم عنصر حذف شده را در آن قرار دهیم:
توجه = در حال حاضر درخت از پنج عنصر تشکیل شده‌است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار ۴ آرایه زیر حاصل می‌شود:
و با درج عنصر حذف شده در محل بلا استفاده:
به همین ترتیب با تکرار الگوریتم نتیجه نهایی حاصل می‌شود:
باید توجه داشت که بر خلاف نتیجه نهایی روش قبل، در این حالت عناصر به صورت نزولی به دست آمده‌اند. یعنی در این روش از درخت min-heap برای مرتب‌سازی نزولی و از درخت max-heap برای مرتب‌سازی صعودی استفاده می‌شود.

ساختن یک درخت Max-Heap

می‌توانیم برای تبدیل آرایه[A[1..n به یک max-Heap که [n=length[A از روال MAX-HEAPIFY به روش پایین به بالا استفاده کنیم. از آنجایی که عناصر زیر آرایه [A[(n/2)+1)...n همگی برگ‌های درخت هستند و بنابراین هر کدام یک Heap یک عنصری برای شروع است، روالBUILD-MAX-HEAP در راستای گره‌های باقی‌مانده درخت حرکت کرده و برای هر یک MAX-HEAPIFY را اجرا می‌کند.

 
BUILD-MAX-HEAP(A)1 heap-size=length[A]2 for i=length[A]/2 downto 13 do MAX-HEAPIFY(A,i)

روال MAX-HEAPIFY

MAX-HEAPIFY یک زیرروال مهم برای دستکاری max-Heapها است. ورودی آن آرایهA و اندیس i در آرایه‌است. زمانی که MAX-HEAPIFY فراخوانی می‌شود، فرض می‌شود که درخت‌های دودویی مشتق شده از فرزندان چپ و راستش،max-Heap هستند، ولی عنصر[A[iممکن است کوچکتر از فرزندانش باشد، بنابراین ویژگی max-Heap مورد تخطی قرار می‌گیرد. وظیفه MAX-HEAPIFY این است که مقدار موجود در [A[i را در max-Heap به پایین حرکت دهد تا زیر درخت مشتق شده ازi، یک max-Heapشود.
MAX-HEAPIFY(A,i)1 l=LEFT(i)2 r=RIGTH(i)3 if(l≤heap-size[A] &&A[l[>A[i]4 then largest=l5 else largest=i6 if(r≤heap-size[A] && A[r]>A[largest]7 then largest=r8 if (largest≠i)9 then swap(A[i],A[largest])10 MAX-HEAPIFY(A,largest)

شبه کد مرتب‌سازی هرمی

دو نوع Heap دودویی وجود دارد:max-Heapها وmin-Heapها. در هر دو نوع، مقادیر درون گره‌ها ویژگی Heap را ارضاء می‌کنند که ویژگی‌های هرکدام به نوع Heap بستگی دارند. ویژگیmax-Heap این است که برای هر گره i به جزء ریشه:
A[PARENT(i)]>A[i]
به‌طوری که:
PARENT(i)return i/2
به عبارت دیگر مقدار یک گره حداکثر برابر مقدار پدرش است؛ بنابراین بزرگترین عضو max-Heap در ریشه ذخیره می‌شود. ویژگی min-Heap به صورت بر عکس شکل می‌گیرد. کوچکترین عضو در ریشه قرار می‌گیرد. در این الگوریتم مرتب‌سازی ازmax-Heap استفاده کردیم.
 HEAPSORT(A)1 BIULD-MAX-HEAP(A)2 for(i=length [A] downto 2)3 do swap(A[1],A[i])4 Heap-size[A]=Heap-size[A]-15 MAX-HEAPIFY(A,1)

زمان اجرا

روال HEAPSORT زمان (O(n lgn را صرف می‌کند چون فراخوانی BUILD-HEAPزمان (O(n و هر یک از n-1 فراخوانی MAX-HEAPIFY زمان
(O(lgn را صرف می‌کند.

بررسی فضای مصرفی مرتب‌سازی هرمی

در روش بحث شده برای مرتب کردن n عنصر، دو آرایه n عنصری نیاز است. یکی از این آرایه‌ها عناصر را به فرم درخت heap به عنوان ورودی الگوریتم، و دیگری عناصر مرتب شده را به عنوان خروجی الگوریتم شامل می‌شوند. در چنین حالتی این الگوریتم یک روش مرتب‌سازی درجا نیست. با اندکی تغییر در روش پیاده‌سازی الگوریتم می‌توان عملکرد دو آرایه را در یک آرایه ادغام کرده، و میزان حافظه مصرفی را کاهش داد.
درخت min-heap مثال فوق را در نظر بگیرید. با حذف عدد یک به عنوان گره ریشه درخت و اعمال تغییرات لازم به نتیجه زیر می‌رسیم:
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان می‌دهد. خانه شماره ۶ حاوی اطلاعات سوخته و بلا استفاده‌است. پس می‌توانیم عنصر حذف شده را در آن قرار دهیم:
توجه داشته باشید که در حال حاضر درخت از پنج عنصر تشکیل شده‌است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار ۴ آرایه زیر حاصل می‌شود:
و با درج عنصر حذف شده در محل بلا استفاده:
به همین ترتیب با تکرار الگوریتم نتیجه نهایی حاصل می‌شود:
روش مرتب‌سازی انتخابی (Selection Sort) یکی از روش‌های اولیه مرتب‌سازی بر اساس مقایسه عناصر است. این الگوریتم طی چند مرحله عناصر فهرست را به صورت صعودی یا نزولی مرتب می‌کند. به این ترتیب که در هر مرحله با بررسی عناصر نامرتب، بزرگترین (یا کوچکترین) عنصر را پیدا کرده، و به انتهای فهرست منتقل می‌کند.
فهرست اعداد زیر را در نظر بگیرید، که باید به صورت صعودی (کوچک به بزرگ) مرتب شود:
۲ ۸ ۴ ۱ ۷
در مرحله اول، کل فهرست از ابتدا تا انتها بررسی شده، و بزرگترین عنصر با عنصر انتهای فهرست نامرتب جابجا می‌شود:
۱) ۲ ۸ ۴ ۱ ۷ -> ۲ ۷ ۴ ۱ ۸
در مرحله دوم، پیمایش از ابتدای فهرست تا عنصر چهارم صورت گرفته، و بزرگترین عنصر با عنصر انتهای آن جابجا می‌شود:
۲) ۲ ۷ ۴ ۱ ۸ -> ۲ ۱ ۴ ۷ ۸
علت این که چرا عنصر پنجم بررسی نمی‌شود کاملاً مشخص است. این عنصر در مرحله قبل به عنوان بزرگترین عنصر به انتهای فهرست منتقل شده‌است، و به‌طور حتم نیاز به جابجایی ندارد.
در مرحله سوم، عناصر اول تا سوم بررسی شده و بزرگترین عنصر به انتهای آن منتقل می‌شود:
۳) ۲ ۱ ۴ ۷ ۸ -> ۲ ۱ ۴ ۷ ۸
و در مرحله آخر دو عنصر باقی‌مانده مقایسه می‌شوند:
۴) ۲ ۱ ۴ ۷ ۸ -> ۱ ۲ ۴ ۷ ۸
و به این ترتیب فهرست مرتب می‌شود.