مرتبسازی درجی
مثل مرتب کردن کارتهای بازی در دست: هر عضو را برمیدارد و در جای درستش در بخش مرتبشدهی سمت چپ میگذارد.
مرتبسازی درجی مثل مرتب کردن کارتهای بازی در دست است. سمت چپ آرایه همیشه مرتب است. در هر دور، عضو بعدی (key) برداشته میشود، عضوهای بزرگتر از آن در بخش مرتب یک خانه به راست میروند، و key در جای خالی قرار میگیرد.
- زمان:
O(n²) - حافظه:
O(1) - CLRS، بخش ۲.۱
- هوروویتز–ساهنی، فصل ۷
- جانسونباو، فصل ۴
شش عدد درهم که در چند دور مرتب میشوند؛ مناسب برای دنبال کردن دستبهدست.
def insertion_sort(a):for j in range(1, len(a)):key = a[j]i = j - 1while i >= 0:if a[i] <= key:breaka[i + 1] = a[i]i = i - 1a[i + 1] = keyreturn a
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
a list
Call stack
- insertion_sort()خط 1
رشد تعداد عملیات با اندازهی ورودی
میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.
- comparisons
- shift
- insert
- ورودی فعلی (n=6)
نمایش به شکل جدول
| n | comparisons | shift | insert |
|---|---|---|---|
| 4 | 5.1 | 3.3 | 3 |
| 6 | 10.9 | 7.6 | 5 |
| 8 | 17.6 | 12 | 7 |
| 10 | 28.4 | 21.3 | 9 |
| 12 | 38.7 | 29.4 | 11 |
| 14 | 54.3 | 43 | 13 |
| 16 | 70.8 | 58.4 | 15 |
توضیح
ایده
مرتبسازی درجی مثل مرتب کردن کارتهای بازی در دست است. سمت چپ آرایه همیشه مرتب است. در هر دور، عضو بعدی (key) برداشته میشود، عضوهای بزرگتر از آن در بخش مرتب یک خانه به راست میروند، و key در جای خالی قرار میگیرد.
گامها
- از خانهی
j = 1شروع کن؛ بخشa[0..0]بهتنهایی مرتب است. key = a[j]را بردار.- با
iازj − 1به عقب برو. تا وقتیa[i] > keyاست،a[i]را یک خانه به راست ببر. - وقتی به عضوی رسیدی که
≤ keyاست (یا به ابتدای آرایه)،keyرا درa[i + 1]بگذار. jرا یکی زیاد کن و تکرار کن.
هزینه
- بهترین حالت (آرایهی مرتب): هر
keyفقط یک مقایسه دارد، پسO(n). - بدترین حالت (آرایهی برعکس):
keyشمارهیjباید از کنارjعضو رد شود، پس روی همn(n − 1)/2جابهجایی وO(n²). - حافظهی اضافه فقط
O(1)است: مرتبسازی درجا انجام میشود.
پایداری
چون شرط توقف a[i] ≤ key است، عضوهای برابر هیچوقت از کنار هم رد نمیشوند. پس ترتیب نسبی عضوهای برابر حفظ میشود و مرتبسازی پایدار است. در ورودی «عضوهای تکراری» این را ببین.
در trace به چه چیزی نگاه کنی
- فلشهای
iوjزیر میلهها جای دو اندیس را نشان میدهند وkeyبالای آرایه نوشته شده است. - میلهی نارنجی خانهای است که در همین گام نوشته شد. میلهی با حاشیهی نارنجی همان است که با
keyمقایسه میشود. - شمار
shiftرا در «بهترین حالت» و «بدترین حالت» مقایسه کن.