AlgoVerse

مرتب‌سازی مبنایی

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

مرتب‌سازی مبنایی عددها را رقم‌به‌رقم مرتب می‌کند، از کم‌ارزش‌ترین رقم (یکان) شروع کرده. هر گذر یک مرتب‌سازی شمارشی روی همان رقم است (فقط ده مقدار ممکن: ۰ تا ۹).

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

هفت عدد سه‌رقمی: سه گذر برای یکان، دهگان و صدگان.

  1. def radix_sort(a):
  2. exp = 1
  3. while max(a) // exp > 0:
  4. a = sort_by_digit(a, exp)
  5. exp = exp * 10
  6. return a
  7. def sort_by_digit(a, exp):
  8. count = [0] * 10
  9. for x in a:
  10. d = (x // exp) % 10
  11. count[d] = count[d] + 1
  12. for d in range(1, 10):
  13. count[d] = count[d] + count[d - 1]
  14. out = [0] * len(a)
  15. for j in range(len(a) - 1, -1, -1):
  16. d = (a[j] // exp) % 10
  17. count[d] = count[d] - 1
  18. out[count[d]] = a[j]
  19. return out

ناوردا: بعد از مرتب کردن بر اساس رقم exp، آرایه بر اساس عددی که از exp رقم آخر ساخته می‌شود مرتب است.

شروع اجرا

3290457165728393436472053556

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

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

a list

329457657839436720355

Call stack

  1. radix_sort()خط 1
گام ۱ از ۲۳۵
خط سیاه = pass_done · خط نارنجی = گام کلیدیcount: 0/21 · place: 0/21 · pass_done: 0/3

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

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

    • place
    • ورودی فعلی (n=7)
    020406046810121416n = تعداد عضوهای آرایهplace
    نمایش به شکل جدول
    nplace
    412
    618
    824
    1030
    1236
    1442
    1648
    توضیح

    ایده

    مرتب‌سازی مبنایی عددها را رقم‌به‌رقم مرتب می‌کند، از کم‌ارزش‌ترین رقم (یکان) شروع کرده. هر گذر یک مرتب‌سازی شمارشی روی همان رقم است (فقط ده مقدار ممکن: ۰ تا ۹).

    چرا از یکان؟

    کلید کار پایداری هر گذر است. بعد از گذر یکان، عددها بر اساس یکان مرتب‌اند. گذر دهگان آن‌ها را بر اساس دهگان مرتب می‌کند و چون پایدار است، عددهایی که دهگان برابر دارند همان ترتیب یکان را نگه می‌دارند. پس بعد از گذر دهگان، آرایه بر اساس دو رقم آخر مرتب است، و همین‌طور تا آخرین رقم.

    هزینه

    برای d رقم: O(d·(n + 10)). وقتی تعداد رقم‌ها ثابت است، زمان خطی است و از n log n بهتر.

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

    • با سطح جزئیات «هر دور حلقه» فقط پایان هر گذر را ببین و ترتیب میله‌ها را بعد از هر رقم دنبال کن.
    • در ورودی «مثال به سبک کتاب»، بعد از گذر یکان عددها بر اساس رقم آخرشان مرتب‌اند (۷۲۰، ۳۵۵، ۴۳۶، …).