مرتب‌سازی هرمی - الگوریتمستان
الگوریتمستان
3314.005.00
  »  

       

آشنایی با روش مرتب‌سازی هرمی (Heap Sort)

http://www.aachp.ir آنچه می‌خوانید ویراست جدید نوشته‌ای است که اولین بار با عنوان «مرتب سازی هرمی» خرداد ماه 1387 از طریق وبگاه برنامه‌نویسی و طراحی الگوریتم (عنوان و طرح پیشین وبگاه الگوریتمستان) منتشر شده بود.


آنچه در این نوشته می‌خوانید:

مرتب‌سازی هرمی (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 برای مرتب‌سازی صعودی استفاده می‌شود.


نوشته‌های مرتبط
        ویدئوهای آموزشی دوره‌ی Algorithms: Design and Analysis دانشگاه استنفورد با زیرنویس انگلیسی
        آشنایی با روش مرتب‌سازی انتخابی،همراه با قطعه کد به زبان برنامه‌نویسی ++C
        معرفی الگوریتم جستجوی اول سطح (BFS) برای پیمایش گراف و کاربردهای آن به همراه قطعه کد به زبان برنامه‌نویسی ++C
        آشنایی با روش مرتب‌سازی حبابی و بحث در مورد عملکرد آن، با قطعه کد به زبان برنامه‌نویسی ++C
        آشنایی با روش مرتب‌سازی ادغامی با قطعه کدهایی به زبان برنامه‌نویسی ++C
        آشنایی با درخت جستجوی دودویی (Binary Search Tree) و عملیات جستجو و درج و حذف گره
        آشنایی با روش مرتب‌سازی سریع، همراه با قطعه کدهای نمونه به زبان برنامه‌نویسی ++C
        آشنایی با صف اولویتی (Priority Queue)، کاربردها و نحوه‌ی پیاده‌سازی آن
        آشنایی با روش مرتب‌سازی درجی، همراه با قطعه کد به زبان برنامه‌نویسی ++C
        آشنایی با درخت Heap (هیپ، هرم یا کپه) به عنوان یکی از ساختمان های داده پرکاربرد و بررسی روش ساخت، درج گره و حذف گره و ارائه‌ی کد نمونه به زبان برنامه‌نویسی ++C
پیوند کوتاه صفحه دسته‌بندی
امتیاز نوشته
  • 1
  • 2
  • 3
  • 4
  • 5
ارسال پیام

نام: *  

پست الکترونیک:

وبگاه:

متن پیام: *

 


» نجمه

جمعه، ۶ آبان ماه ۱۳۹۰، ساعت ۲۳:۲۵
خیلی ممنون
خیلی خوبه...کاش کد هرمی رو هم قرار داده بودید060612

» حسین

چهارشنبه، ۷ دی ماه ۱۳۹۰، ساعت ۲۰:۰۲
لطفا کد هرمی رو هم قرار دهید

» محسن

جمعه، ۳۰ دی ماه ۱۳۹۰، ساعت ۰۹:۵۴
ممنون ..

» منادی

یکشنبه، ۲ بهمن ماه ۱۳۹۰، ساعت ۱۵:۵۷
پرمحتوایی داری
متشکر
12

» ali

یکشنبه، ۲۱ آبان ماه ۱۳۹۱، ساعت ۲۰:۳۸
aliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii     ey kash code  boodeesh.ke  beshe  khodemon trace konim motevajeh beshiim


یکشنبه، ۲۱ آبان ماه ۱۳۹۱، ساعت ۲۰:۵۹
مسعود:
ممنون دوستان عزیز.

کد در قسمت معرفی درخت هیپ موجوده.

» شیوا

دوشنبه، ۱۳ آذر ماه ۱۳۹۱، ساعت ۱۳:۰۶
سلام اگه میشه در مورد این سوال منو راهنمایی کنید:

برنامه ای بنویسید که با دریافت عدد nمشخص کند با این عدد چه تعداد max-heap می توان ساخت به عنوان مثال اگر کاربر عدد 7 را وارد کند پاسخ 80 میشود.

گفتن باید یک فرمول دربیارید!!!!!!

» ارد

سه‌شنبه، ۱۴ آذر ماه ۱۳۹۱، ساعت ۰۷:۵۰
باسلام وتشکروخسته نباشیدازاین سایت وزین وبامطالب باارزش .  لطفا در صورت امکان محاسبات ریاضی پیچیدگی زمان اجرای الگوریتم درمرتب سازی
هاراهم به مطالبتان اضافه فرمایید.01

» محمد

شنبه، ۲ دی ماه ۱۳۹۱، ساعت ۱۰:۱۳
با سلام خدمت شما دوست عزیز یک سوال از شما داشتم.
مرتبه زمانی الگوریتم هافمن برابر تتا (n log n) بر اساس عملکرد هافمن و بررسی مفهوم maxheap و minheap تحلیل کنید چرا مرتبه ی زمانی هافمن برابر زمان ذکر شده است؟
با تشکر
ضمناً مطالب سایت آموزنده می باشد.

» فرزاد کمالی فر

شنبه، ۱۶ دی ماه ۱۳۹۱، ساعت ۲۳:۲۲
توضیحات روان و قابل درک بود
متشکر

» مریم

سه‌شنبه، ۲۴ اردیبهشت ماه ۱۳۹۲، ساعت ۱۴:۲۳
با سلام حذف یک عنصر از درخت مکس هیپ رو میخواستم

» محمدعلی

یکشنبه، ۲۰ مرداد ماه ۱۳۹۲، ساعت ۱۹:۳۹
حذف از درخت مکس هیپ از ریشه صورت میگیرد به این صورت آخرین داده درخت (که کامل بودن درخت را نقض نکند) به جای ریشه قرار میگیرد و مجددا عمل heaping انجام میشود. به سایت ماهم سر بزنید:
mohajerunivercity.blogfa.com

» نجمه

سه‌شنبه، ۱۹ فروردین ماه ۱۳۹۳، ساعت ۱۴:۲۲
سلام
عالی بود
ممنون01

» علی

سه‌شنبه، ۱۳ خرداد ماه ۱۳۹۳، ساعت ۱۴:۵۵
خواهشن کد...