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

محتوای حذف‌شده محتوای افزوده‌شده
Saeed Ghamsari (بحث | مشارکت‌ها)
بدون خلاصۀ ویرایش
Mona.tehrani (بحث | مشارکت‌ها)
صفحه‌ای جدید حاوی « == مرتب‌سازی هرمی (Heap Sort)== '''مرتب‌سازی هرمی (Heap Sort)''' یکی از روش‌های مرتب‌س...» ایجاد کرد
برچسب: منبع‌دهی نادرست (AF)
خط ۱:
'''مرتب‌سازی هرمی'''{{به انگلیسی|Heapsort}}، نوعی [[الگوریتم]] است که در آن از مقایسه برای چینش یک [[آرایه (رایانه)|آرایه]] یا لیست استفاده می‌شود. این الگوریتم بخشی از خانوادهٔ [[مرتب‌سازی انتخابی]] است. با وجود اینکه در اکثر رایانه‌ها از الگوریتم [[مرتب‌سازی سریع|چینش سریع]] کند تر است ولی در بدترین حالت سرعت بالاتری (<math>O(n log n)</math>) را دارا می‌باشد. این الگوریتم [[در-محل|در محل]] است، ولی حالت [[الگوریتم پایدار|پایداری]] ندارد.
 
==مرتب سازیمرتب‌سازی هرمی (Heap Sort)==
در این مرتب سازی، ابتدا از کل آرایه داده شده یک [[درخت مکس هیپ]] (یا [[درخت مین هیپ]] ) می‌سازد. سپس بزرگترین مقدار را بر می‌دارد و در انتهای آرایه مرتب شده قرار می‌دهد. بعد از حدف بزرگترین مقدار، دوباره از بقیه اعداد یک درخت مکس هییپ می‌سازد تا دومین عدد بزرگ یافت شود. بزرگ‌ترین مقدار در بین مقادیر باقی مانده را برمی دارد و آن را در مکان یکی قبل از انتهای آرایه قرار می‌دهد. این کار تا زمانی که هیچ مقداری در هرم باقی نماند و آرایه مرتب شده کامل شود، تکرار می‌شود.
 
== ساختن یک درخت Max-Heap ([[ساختمان داده دودویی]]) ==
می توانیم برای تبدیل آرایه[A[1..n به یک max-Heap که [n=length[A از روال [[MAX-HEAPIFY]] به روش پایین به بالا استفاده کنیم. از آنجایی که عناصر زیر آرایه [A[(n/2)+1)...n همگی برگ‌های درخت هستند و بنابراین هر کدام یک Heap یک عنصری برای شروع است، روالBUILD-MAX-HEAP در راستای گره‌های باقیمانده درخت حرکت کرده و برای هر یک MAX-HEAPIFY را اجرا می‌کند.
 
'''مرتب‌سازی هرمی (Heap Sort)'''
<source lang="java">
BUILD-MAX-HEAP(A)
یکی از روش‌های مرتب‌سازی داده‌هااست,که براساس خصوصیات درخت heap پیاده‌سازی شده است.
1 heap-size=length[A]
بر اساس تعریف درخت heap، در یک max-heap یا min-heap بزرگترین یا کوچکترین مقدار بین داده‌ها همواره در ریشه درخت قرار دارد. یافتن بزرگترین یا کوچکترین عنصر بین عناصر، هزینه ثابت ( Ө( 1 دارد. با حذف این عنصر از درخت، بزرگترین یا کوچکترین عنصر بعدی مجددا در ریشه قرار می‌گیرد. به این ترتیب با حذف متوالی عناصر درخت heap و درج آنها در محل جدید، یک آرایه مرتب‌شده نزولی ویا صعودی به دست خواهد آمد.
2 for i=length[A]/2 downto 1
3 do MAX-HEAPIFY(A,i)
</source>
 
به عنوان مثال، min-heap زیر راتوضیح می دهیم :
== روال 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شود.
<source lang="java">
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=l
5 else largest=i
6 if(r≤heap-size[A] && A[r]>A[largest]
7 then largest=r
8 if (largest≠i)
9 then swap(A[i],A[largest])
10 MAX-HEAPIFY(A,largest)
</source>
 
== [[شبه کد]] مرتب سازی هرمی ==
دو نوع Heap دودویی وجود دارد:max-Heapها وmin-Heap‌ها.در هر دو نوع، مقادیر درون گره‌ها ویژگی Heap را ارضاء می‌کنند که ویژگی‌های هرکدام به نوع Heap بستگی دارند.ویژگیmax-Heap این است که برای هر گره i به جزء ریشه:
<source lang="java">
A[PARENT(i)]>A[i]
</source>
به طوری که:
<source lang="java">
PARENT(i)
return i/2
</source>
به عبارت دیگر مقدار یک گره حداکثر برابر مقدار پدرش است؛ بنابراین بزرگترین عضو max-Heap در ریشه ذخیره می‌شود.ویژگی min-Heap به صورت بر عکس شکل می‌گیرد.کوچکترین عضو در ریشه قرار می‌گیرد.در این الگوریتم مرتب سازی ازmax-Heap استفاده کردیم.
<source lang="java">
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]-1
5 MAX-HEAPIFY(A,1)
</source>
 
[[تصویر:Heap.PNG|minheap|چپ|قاب]]
== [[زمان اجرا]] ==
 
 
روال HEAPSORT زمان (O(n lgn را صرف می‌کند چون فراخوانی BUILD-HEAPزمان (O(n و هر یک از n-1 فراخوانی MAX-HEAPIFY زمان
مراحل مرتب‌سازی هرمی به ترتیب زیر خواهد بود:
(O(lgn را صرف می‌کند.
== بررسی فضای مصرفی مرتب‌سازی هرمی ==
در روش بحث شده برای مرتب کردن n عنصر، دو آرایه n عنصری نیاز است. یکی از این آرایه‌ها عناصر را به فرم درخت heap به عنوان ورودی الگوریتم، و دیگری عناصر مرتب شده را به عنوان خروجی الگوریتم شامل می‌شوند. در چنین حالتی این الگوریتم یک روش مرتب‌سازی درجا نیست. با اندکی تغییر در روش پیاده‌سازی الگوریتم می‌توان عملکرد دو آرایه را در یک آرایه ادغام کرده، و میزان حافظه مصرفی را کاهش داد.
درخت min-heap مثال فوق را در نظر بگیرید. با حذف عدد یک به عنوان گره ریشه درخت و اعمال تغییرات لازم به نتیجه زیر می‌رسیم:
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان می‌دهد. خانه شماره 6 حاوی اطلاعات سوخته و بلا استفاده است. پس می‌توانیم عنصر حذف شده را در آن قرار دهیم:
توجه داشته باشید که در حال حاضر درخت از پنج عنصر تشکیل شده است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار 4 آرایه زیر حاصل می‌شود:
و با درج عنصر حذف شده در محل بلا استفاده:
به همین ترتیب با تکرار الگوریتم نتیجه نهایی حاصل می‌شود:
 
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 شامل اطلاعات مرتب‌شده صعودی است.
روش مرتب‌سازی انتخابی (Selection Sort) یکی از روش‌های اولیه مرتب‌سازی بر اساس مقایسه عناصر است. این الگوریتم طی چند مرحله عناصر لیست را به صورت صعودی یا نزولی مرتب می‌کند. به این ترتیب که در هر مرحله با بررسی عناصر نامرتب، بزرگترین (یا کوچکترین) عنصر را پیدا کرده، و به انتهای لیست منتقل می‌کند.
لیست اعداد زیر را در نظر بگیرید، که باید به صورت صعودی (کوچک به بزرگ) مرتب شود:
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
و به این ترتیب لیست مرتب می‌شود.
 
== منابع ==
{{انبار-رده|Heap sort}}
* [[ویکی‌پدیا]] انگلیسی
* مقدمه‌ای بر الگوریتم‌ها - پدیدآورنده: تامس کورمن، چارلز لیزرسان، رونالد دیوست، کلیفورد اشتاین - گروه مهندسی-پژوهشی خوارزمی (مترجم) - ناشر: درخشش
{{مرتب‌سازی}}
 
[[رده:الگوریتم‌های مرتب‌سازی]]
[[رده:مرتب‌سازی‌های سنجشی]]
 
[[ca:Heapsort]]
[[cs:Řazení haldou]]
[[de:Heapsort]]
[[en:Heapsort]]
[[es:Heapsort]]
[[fr:Tri par tas]]
[[he:מיון ערימה]]
[[hu:Kupacrendezés]]
[[hy:Heapsort]]
[[is:Hrúguröðun]]
[[it:Heap sort]]
[[ja:ヒープソート]]
[[ko:힙 정렬]]
[[lb:Heapsort]]
[[lt:Krūvos rikiavimo algoritmas]]
[[ml:ഹീപ് സോർട്ട്]]
[[nl:Heapsort]]
[[no:Sorteringsalgoritme#Heap sort]]
[[pl:Sortowanie przez kopcowanie]]
[[pt:Heapsort]]
[[ru:Пирамидальная сортировка]]
[[sl:Urejanje s kopico]]
[[tr:Yığın sıralaması]]
[[uk:Пірамідальне сортування]]
[[vi:Sắp xếp vun đống]]
[[zh:堆排序]]