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

مرتب‌سازی بدون مقایسه: Counting Sort و Radix Sort با پیچیدگی خطی + جدول مقایسه کامل همه الگوریتم‌های مرتب‌سازی

فراتر از مقایسه

همه الگوریتم‌های قبلی بر مقایسه جفت عناصر تکیه داشتند و اثبات شده که نمی‌توان از O(n log n) بهتر شد. اما اگر از ساختار خاص داده استفاده کنیم (مثل اعداد صحیح در بازه محدود)، می‌توان خطی O(n) مرتب کرد!

Counting Sort — مرتب‌سازی شمارشی

ایده: به‌جای مقایسه، تعداد تکرار هر مقدار را بشمار:

  1. بازه مقادیر را پیدا کن (مثلاً ۰ تا ۹)
  2. آرایه شمارش بساز: چند بار هر مقدار آمده؟
  3. از آرایه شمارش، خروجی مرتب بساز
ورودی: [4, 2, 2, 8, 3, 3, 1]
شمارش: [1, 2, 2, 0, 1, 0, 0, 0, 1]  (اندیس=مقدار)
خروجی: [1, 2, 2, 3, 3, 4, 8]  ✓

پیچیدگی: O(n + k) که k بازه مقادیر است. اگر k کوچک باشد (مثل نمره ۰ تا ۲۰)، فوق‌العاده سریع!

محدودیت: فقط برای اعداد صحیح (یا قابل نگاشت به عدد) و وقتی k معقول باشد.

Radix Sort — مرتب‌سازی مبنایی

ایده: مرتب‌سازی پایدار رقم به رقم از کم‌ارزش‌ترین (LSD):

  1. ارقام یکان: با Counting Sort مرتب کن
  2. ارقام دهگان: دوباره (پایدار!)
  3. ... تا بالاترین رقم
[170, 45, 75, 90, 802, 24, 2, 66]

یکان:   [170, 90, 802, 2, 24, 45, 75, 66]
دهگان:  [802, 2, 24, 45, 66, 170, 75, 90]
صدگان:  [2, 24, 45, 66, 75, 90, 170, 802]  ✓

پیچیدگی: O(d × (n + k)) که d تعداد ارقام است. برای اعداد با ارقام کم، عملاً خطی!

جدول مقایسه همه الگوریتم‌های مرتب‌سازی

الگوریتممیانگینبدترینحافظهپایدارکاربرد
BubbleO(n²)O(n²)O(1)✓آموزشی
SelectionO(n²)O(n²)O(1)✗نوشتن گران
InsertionO(n²)O(n²)O(1)✓کوچک/تقریباً مرتب
MergeO(n log n)O(n log n)O(n)✓تضمینی، دیسک
QuickO(n log n)O(n²)O(log n)✗عمومی، سریع‌ترین عملی
CountingO(n+k)O(n+k)O(k)✓صحیح با بازه کم
RadixO(d(n+k))O(d(n+k))O(n+k)✓اعداد/رشته با ارقام کم

کدام را انتخاب کنم؟

نکته نهایی: در پروژه واقعی، تقریباً همیشه از sort آماده زبان استفاده کنید (TimSort در پایتون) — بهینه‌شده و تست‌شده. پیاده‌سازی دستی برای یادگیری و مصاحبه است!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.

ابزارهای مرتبط