مرتب‌سازی هرمی: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
علیرضا (بحث | مشارکت‌ها)
اصلاح جعبه اطلاعات، به‌دلیل به‌روزرسانی الگو:جعبه اطلاعات الگوریتم
علیرضا (بحث | مشارکت‌ها)
جز ابرابزار
خط ۱۱:
'''مرتب‌سازی هرمی''' {{به انگلیسی|Heapsort}}، نوعی [[الگوریتم]] است که در آن از مقایسه برای چینش یک [[آرایه (رایانه)|آرایه]] یا فهرست استفاده می‌شود. این الگوریتم بخشی از خانوادهٔ [[مرتب‌سازی انتخابی]] است. با وجود اینکه در اکثر رایانه‌ها از الگوریتم [[مرتب‌سازی سریع|چینش سریع]] کند تر است ولی در بدترین حالت سرعت بالاتری (<math>O(n\log n)</math>) را دارا می‌باشد. این الگوریتم [[در-محل|در محل]] است، ولی حالت [[الگوریتم پایدار|پایداری]] ندارد.
 
در این مرتب سازی،مرتب‌سازی، ابتدا از کل آرایه داده شده یک [[درخت مکس هیپ]] (یا [[درخت مین هیپ]]) می‌سازد. سپس بزرگترین مقدار را بر می‌دارد و در انتهای آرایه مرتب شده قرار می‌دهد. بعد از حدف بزرگترین مقدار، دوباره از بقیه اعداد یک درخت مکس هییپ می‌سازد تا دومین عدد بزرگ یافت شود. بزرگ‌ترین مقدار در بین مقادیر باقی مانده را برمی دارد و آن را در مکان یکی قبل از انتهای آرایه قرار می‌دهد. این کار تا زمانی که هیچ مقداری در هرم باقی نماند و آرایه مرتب شده کامل شود، تکرار می‌شود.
 
یکی از روش‌های مرتب‌سازی داده‌هااست,داده‌هااست، که براساس خصوصیات درخت heap پیاده‌سازی شده‌است.
بر اساس تعریف درخت heap، در یک max-heap یا min-heap بزرگترین یا کوچکترین مقدار بین داده‌ها همواره در ریشه درخت قرار دارد. یافتن بزرگترین یا کوچکترین عنصر بین عناصر، هزینه ثابت (Ө(1۱ دارد. با حذف این عنصر از درخت، بزرگترین یا کوچکترین عنصر بعدی مجددا در ریشه قرار می‌گیرد. به این ترتیب با حذف متوالی عناصر درخت heap و درج آنها در محل جدید، یک آرایه مرتب‌شده نزولی ویا صعودی به دست خواهد آمد.
 
به عنوان مثال، min-heap زیر راتوضیح می‌دهیم:
خط ۴۸:
[[پرونده:11dheap.PNG]]
 
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان می‌دهد. خانه شماره 6۶ حاوی اطلاعات بلا استفاده‌است. پس می‌توانیم عنصر حذف شده را در آن قرار دهیم:
 
[[پرونده:12dheap.PNG]]
 
توجه = در حال حاضر درخت از پنج عنصر تشکیل شده‌است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار 4۴ آرایه زیر حاصل می‌شود:
 
[[پرونده:12dheap.PNG]]
خط ۹۸:
</source>
 
== شبه کد مرتب سازیمرتب‌سازی هرمی ==
دو نوع Heap دودویی وجود دارد:max-Heapها وmin-Heapها. در هر دو نوع، مقادیر درون گره‌ها ویژگی Heap را ارضاء می‌کنند که ویژگی‌های هرکدام به نوع Heap بستگی دارند. ویژگیmax-Heap این است که برای هر گره i به جزء ریشه:
<source lang="java">
خط ۱۰۸:
return i/2
</source>
به عبارت دیگر مقدار یک گره حداکثر برابر مقدار پدرش است؛ بنابراین بزرگترین عضو max-Heap در ریشه ذخیره می‌شود. ویژگی min-Heap به صورت بر عکس شکل می‌گیرد. کوچکترین عضو در ریشه قرار می‌گیرد. در این الگوریتم مرتب سازیمرتب‌سازی ازmax-Heap استفاده کردیم.
<source lang="java">
HEAPSORT(A)
خط ۱۲۸:
درخت min-heap مثال فوق را در نظر بگیرید. با حذف عدد یک به عنوان گره ریشه درخت و اعمال تغییرات لازم به نتیجه زیر می‌رسیم:
 
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان می‌دهد. خانه شماره 6۶ حاوی اطلاعات سوخته و بلا استفاده‌است. پس می‌توانیم عنصر حذف شده را در آن قرار دهیم:
 
توجه داشته باشید که در حال حاضر درخت از پنج عنصر تشکیل شده‌است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار 4۴ آرایه زیر حاصل می‌شود:
 
و با درج عنصر حذف شده در محل بلا استفاده:
خط ۱۳۹:
فهرست اعداد زیر را در نظر بگیرید، که باید به صورت صعودی (کوچک به بزرگ) مرتب شود:
 
2۲ 8۸ 4۴ 1۱ 7۷
 
در مرحله اول، کل فهرست از ابتدا تا انتها بررسی شده، و بزرگترین عنصر با عنصر انتهای فهرست نامرتب جابجا می‌شود:
 
1۱) 2۲ 8۸ 4۴ 1۱ 7۷ -> 2۲ 7۷ 4۴ 1۱ 8۸
 
در مرحله دوم، پیمایش از ابتدای فهرست تا عنصر چهارم صورت گرفته، و بزرگترین عنصر با عنصر انتهای آن جابجا می‌شود:
 
2۲) 2۲ 7۷ 4۴ 1۱ 8۸ -> 2۲ 1۱ 4۴ 7۷ 8۸
 
علت این که چرا عنصر پنجم بررسی نمی‌شود کاملا مشخص است. این عنصر در مرحله قبل به عنوان بزرگترین عنصر به انتهای فهرست منتقل شده‌است، و به طور حتم نیاز به جابجایی ندارد.
در مرحله سوم، عناصر اول تا سوم بررسی شده و بزرگترین عنصر به انتهای آن منتقل می‌شود:
 
3۳) 2۲ 1۱ 4۴ 7۷ 8۸ -> 2۲ 1۱ 4۴ 7۷ 8۸
 
و در مرحله آخر دو عنصر باقیمانده مقایسه می‌شوند:
 
4۴) 2۲ 1۱ 4۴ 7۷ 8۸ -> 1۱ 2۲ 4۴ 7۷ 8۸
 
و به این ترتیب فهرست مرتب می‌شود.