مرتب‌سازی حبابی در پایتون

متوسطلیست و الگوریتم

صورت سؤال

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

از sort و sorted استفاده نکنید. اگر در یک دور هیچ جابه‌جایی انجام نشد، لیست مرتب است و برنامه باید زودتر متوقف شود.

ورودی نمونه

5 2 9 1 5 6

خروجی نمونه

1 2 5 5 6 9

خودتان امتحان کنید

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

Ctrl + Enter
خروجی

کد را اجرا کنید تا خروجی آن اینجا نمایش داده شود.

راهنمایی

دو حلقهٔ تودرتو لازم دارید: حلقهٔ بیرونی دورها را می‌شمارد و حلقهٔ درونی هر عضو را با عضو بعدی‌اش مقایسه می‌کند. برای جابه‌جایی در پایتون کافی است بنویسید a, b = b, a.

جواب و توضیح

بهتر است جواب را بعد از امتحان کردن راه خودتان باز کنید.

نمایش جواب
nums = list(map(int, input().split()))

n = len(nums)
for i in range(n - 1):
    swapped = False
    for j in range(n - 1 - i):
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            swapped = True
    if not swapped:
        break

print(*nums)

این جواب چطور کار می‌کند؟

حلقهٔ درونی از ابتدای لیست جلو می‌رود و هر عضو را با عضو بعدی‌اش مقایسه می‌کند. اگر عضو قبلی بزرگ‌تر باشد، جای دو عضو عوض می‌شود. به این ترتیب در پایان دور اول، بزرگترین عدد به آخر لیست رسیده است.

بعد از دور i، تعداد i عضو آخر سر جای درستشان نشسته‌اند. برای همین حلقهٔ درونی فقط تا n - 1 - i جلو می‌رود و این عضوها را دوباره مقایسه نمی‌کند.

متغیر swapped نشان می‌دهد که در دور فعلی جابه‌جایی انجام شده است یا نه. اگر یک دور کامل بدون جابه‌جایی تمام شود، لیست مرتب است و break دورهای باقی‌مانده را کنار می‌گذارد. برای لیستی که از اول مرتب باشد، برنامه بعد از یک دور تمام می‌شود.

راه دوم: تابع sorted

nums = list(map(int, input().split()))
print(*sorted(nums))

در برنامهٔ واقعی همیشه از sorted یا متد sort استفاده کنید. پایتون برای مرتب‌سازی الگوریتم Timsort را به کار می‌برد که برای لیست‌های بزرگ بسیار سریع‌تر از مرتب‌سازی حبابی است.

اشتباه‌های رایج

  • حلقهٔ درونی را تا range(n) می‌برند و nums[j + 1] در آخرین مقایسه به خطای IndexError می‌رسد.
  • برای جابه‌جایی اول nums[j] = nums[j + 1] و بعد nums[j + 1] = nums[j] را می‌نویسند؛ مقدار اول از دست می‌رود و هر دو خانه یکسان می‌شوند.
  • علامت مقایسه را برعکس می‌گذارند و لیست از بزرگ به کوچک مرتب می‌شود.

تمرین بعدی

پایتون را قدم‌به‌قدم یاد بگیرید

این تمرین یکی از تمرین‌های پایتون با جواب دینا کد است. در دورهٔ پایتون از صفر هر مفهوم یک درس کوتاه دارد و تمرین هر درس با چند آزمون پنهان نمره می‌گیرد؛ درس‌های اول رایگان است. برای امتحان کد آزاد هم اجرای آنلاین پایتون در دسترس است.