مرتبسازی شل
مرتبسازی درجی روی عضوهایی که gap خانه از هم فاصله دارند، با gapهای کوچکشونده تا ۱؛ عضوهای دور زود به جای درستشان نزدیک میشوند.
مرتبسازی درجی روی آرایهی تقریباً مرتب خیلی سریع است، ولی عضوی که از جای درستش دور است باید یکییکی خانهها را طی کند. شل این مشکل را با gap حل میکند: اول عضوهایی را که gap خانه از هم فاصله دارند با مرتبسازی درجی مرتب میکند، تا عضوها با جهشهای بلند به جای تقریبیشان برسند. بعد gap را نصف میکند و دوباره، تا gap = 1 که همان مرتبسازی درجی معمولی است، ولی روی آرایهای که تقریباً مرتب شده.
- زمان:
O(n²) with gaps n/2, n/4, …; better with other gap sequences - حافظه:
O(1) - هوروویتز–ساهنی، فصل ۷
هشت عدد درهم: gapها ۴، ۲ و ۱.
def shell_sort(a):gap = len(a) // 2while gap > 0:for j in range(gap, len(a)):key = a[j]i = j - gapwhile i >= 0:if a[i] <= key:breaka[i + gap] = a[i]i = i - gapa[i + gap] = keygap = gap // 2return a
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
a list
Call stack
- shell_sort()خط 1
رشد تعداد عملیات با اندازهی ورودی
میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.
- comparisons
- shift
- insert
- ورودی فعلی (n=8)
نمایش به شکل جدول
| n | comparisons | shift | insert |
|---|---|---|---|
| 4 | 6 | 2.8 | 5 |
| 6 | 11.6 | 5.9 | 8 |
| 8 | 21.1 | 7 | 17 |
| 10 | 29.1 | 11.3 | 22 |
| 12 | 37.8 | 16.7 | 26 |
| 14 | 44 | 19.4 | 31 |
| 16 | 68.7 | 26.8 | 49 |
توضیح
ایده
مرتبسازی درجی روی آرایهی تقریباً مرتب خیلی سریع است، ولی عضوی که از جای درستش دور است باید یکییکی خانهها را طی کند. شل این مشکل را با gap حل میکند: اول عضوهایی را که gap خانه از هم فاصله دارند با مرتبسازی درجی مرتب میکند، تا عضوها با جهشهای بلند به جای تقریبیشان برسند. بعد gap را نصف میکند و دوباره، تا gap = 1 که همان مرتبسازی درجی معمولی است، ولی روی آرایهای که تقریباً مرتب شده.
هزینه
- با gapهای
n/2, n/4, …, 1بدترین حالتO(n²)است، ولی در عمل خیلی بهتر از مرتبسازی درجی کار میکند. - با دنبالههای بهتر (مثلاً
1, 4, 13, 40, …) زمان به حدودO(n^1.5)میرسد. - حافظهی اضافه
O(1)؛ پایدار نیست.
در trace به چه چیزی نگاه کنی
- با سطح جزئیات «هر دور حلقه» فقط تغییر
gapرا ببین. - ورودی «برعکس مرتب» را با مرتبسازی درجی روی همان ورودی مقایسه کن (شمار
shift).