AlgoVerse

مرتب‌سازی سطلی

بازه را به n سطل برابر تقسیم می‌کند، هر عدد را در سطل خودش می‌اندازد، سطل‌ها را جدا مرتب می‌کند و پشت هم می‌چیند.

اگر عددها در بازه‌ای مشخص یکنواخت پخش باشند، می‌شود بازه را به n سطل هم‌اندازه تقسیم کرد. هر سطل به‌طور متوسط فقط یک عضو می‌گیرد، پس مرتب کردن سطل‌ها تقریباً رایگان است.

ادامه‌ی توضیح ↓
ورودی:
n=10خروجی PDF

ده عدد پخش در بازه؛ بیشتر سطل‌ها یک یا دو عضو دارند و مرتب کردنشان تقریباً هزینه‌ای ندارد.

  1. def bucket_sort(a):
  2. n = len(a)
  3. buckets = [[] for _ in range(n)]
  4. for x in a:
  5. buckets[x * n // 100].append(x)
  6. for b in buckets:
  7. insertion_sort(b)
  8. out = []
  9. for b in buckets:
  10. out.extend(b)
  11. return out
  12. def insertion_sort(b):
  13. for j in range(1, len(b)):
  14. key = b[j]
  15. i = j - 1
  16. while i >= 0:
  17. if b[i] <= key:
  18. break
  19. b[i + 1] = b[i]
  20. i = i - 1
  21. b[i + 1] = key

ناوردا: هر عدد سطل i کوچک‌تر از هر عدد سطل i + 1 است، پس پشت هم چیدن سطل‌های مرتب، کل آرایه را مرتب می‌کند.

شروع اجرا

780171392263724945216127238689

متغیرهای محلی

نارنجی = در همین گام عوض شد

a list

78173926729421122368

Call stack

  1. bucket_sort()خط 1
گام ۱ از ۱۲۶
خط سیاه = sorted_bucket · خط نارنجی = گام کلیدیcompare: 0/5 · drop: 0/10 · sorted_bucket: 0/10 · collect: 0/10

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • comparisons
    • ورودی فعلی (n=10)
    024646810121416n = تعداد عضوهای آرایهcomparisons
    نمایش به شکل جدول
    ncomparisons
    41.2
    61.9
    83.8
    103.8
    124.5
    145.7
    165.9
    توضیح

    ایده

    اگر عددها در بازه‌ای مشخص یکنواخت پخش باشند، می‌شود بازه را به n سطل هم‌اندازه تقسیم کرد. هر سطل به‌طور متوسط فقط یک عضو می‌گیرد، پس مرتب کردن سطل‌ها تقریباً رایگان است.

    1. هر عدد x در سطل ⌊x · n / 100⌋ می‌افتد (اینجا عددها ۰ تا ۹۹اند، یعنی صدم‌های بازه‌ی [0, 1)).
    2. هر سطل جداگانه با مرتب‌سازی درجی مرتب می‌شود.
    3. سطل‌ها به ترتیب پشت هم چیده می‌شوند.

    هزینه

    • برای ورودی یکنواخت، زمان متوسط O(n) است.
    • اگر همه در یک سطل بیفتند (ورودی «همه در یک سطل»)، کار به مرتب‌سازی درجی روی کل آرایه تبدیل می‌شود: O(n²).

    در trace به چه چیزی نگاه کنی

    • لیست buckets در پنل حافظه است: ببین هر عدد در کدام سطل می‌افتد.
    • شمار compare را در ورودی «یکنواخت» (صفر) و «همه در یک سطل» مقایسه کن.