AlgoVerse

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

جفت‌های کنار هم را مقایسه و در صورت نیاز جابه‌جا می‌کند؛ در هر گذر، بزرگ‌ترین عضو مثل حباب به انتها می‌رود.

در هر گذر، جفت‌های کنار هم از چپ به راست مقایسه می‌شوند و اگر ترتیبشان غلط بود جابه‌جا می‌شوند. بزرگ‌ترین عضو بخش نامرتب مثل حباب تا انتهای آن بالا می‌آید و در جای نهایی‌اش می‌نشیند. پس هر گذر یک خانه کوتاه‌تر از قبلی است.

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

شش عدد درهم؛ چند گذر لازم است تا همه‌ی حباب‌ها بالا بیایند.

  1. def bubble_sort(a):
  2. n = len(a)
  3. for end in range(n - 1, 0, -1):
  4. swapped = False
  5. for i in range(end):
  6. if a[i] > a[i + 1]:
  7. a[i], a[i + 1] = a[i + 1], a[i]
  8. swapped = True
  9. if not swapped:
  10. break
  11. return a

ناوردا: بعد از هر گذر، a[end..n−1] شامل بزرگ‌ترین عضوها در جای نهایی‌شان است.

شروع اجرا

501142238435

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

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

a list

514283

Call stack

  1. bubble_sort()خط 1
گام ۱ از ۶۲
خط سیاه = pass_start · خط نارنجی = گام کلیدیcompare: 0/14 · swap: 0/7 · pass_start: 0/4 · early_exit: 0/1

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

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

    • comparisons
    • swaps
    • ورودی فعلی (n=6)
    05010015046810121416n = تعداد عضوهای آرایهcomparisonsswaps
    نمایش به شکل جدول
    ncomparisonsswaps
    45.73.3
    613.67.6
    824.812
    1042.621.3
    1261.329.4
    1484.943
    1611258.4
    توضیح

    ایده

    در هر گذر، جفت‌های کنار هم از چپ به راست مقایسه می‌شوند و اگر ترتیبشان غلط بود جابه‌جا می‌شوند. بزرگ‌ترین عضو بخش نامرتب مثل حباب تا انتهای آن بالا می‌آید و در جای نهایی‌اش می‌نشیند. پس هر گذر یک خانه کوتاه‌تر از قبلی است.

    توقف زودهنگام

    اگر گذری هیچ جابه‌جایی نداشت، آرایه مرتب است و ادامه دادن بی‌فایده است. با همین ترفند، روی ورودی مرتب فقط یک گذر (n − 1 مقایسه) لازم است.

    هزینه

    • بدترین و حالت متوسط O(n²)، بهترین حالت O(n).
    • حافظه‌ی اضافه O(1)؛ مرتب‌سازی پایدار است چون فقط عضوهای کنار هم و فقط وقتی > هستند جابه‌جا می‌شوند.

    «خرگوش و لاک‌پشت»

    عضو بزرگ در ابتدای آرایه (خرگوش) در یک گذر تا انتها می‌دود، ولی عضو کوچک در انتها (لاک‌پشت) در هر گذر فقط یک خانه جلو می‌آید. ورودی «لاک‌پشت» این را نشان می‌دهد.

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

    • فلش end مرز بخش نامرتب است؛ میله‌های بعد از آن در جای نهایی‌اند.
    • شمار swap را با تعداد جفت‌های نابه‌جا (وارونگی‌ها) مقایسه کن: دقیقاً برابرند.