مرتبسازی حبابی در پایتون
مرتبسازی حبابی هر بار دو عضو کنار هم را مقایسه میکند و اگر ترتیبشان غلط بود، جایشان را عوض میکند. بعد از هر دور کامل، بزرگترین عدد باقیمانده مثل حباب به انتهای لیست میرسد. این الگوریتم برای لیستهای بزرگ کند است، اما سادهترین راه برای فهمیدن مرتبسازی است.
صورت سؤال
برنامهای بنویسید که چند عدد صحیح را در یک خط از ورودی بخواند، آنها را با الگوریتم مرتبسازی حبابی از کوچک به بزرگ مرتب کند و نتیجه را با فاصله از هم چاپ کند.
از sort و sorted استفاده نکنید. اگر در یک دور هیچ جابهجایی انجام نشد، لیست مرتب است و برنامه باید زودتر متوقف شود.
ورودی نمونه
5 2 9 1 5 6
خروجی نمونه
1 2 5 5 6 9
خودتان امتحان کنید
کد را در ویرایشگر زیر کامل کنید و اجرا کنید. ورودی نمونه در کادر ورودی آماده است و بعد از هر اجرا، خروجی شما با خروجی نمونه مقایسه میشود.
کد را اجرا کنید تا خروجی آن اینجا نمایش داده شود.
راهنمایی
دو حلقهٔ تودرتو لازم دارید: حلقهٔ بیرونی دورها را میشمارد و حلقهٔ درونی هر عضو را با عضو بعدیاش مقایسه میکند. برای جابهجایی در پایتون کافی است بنویسید 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] را مینویسند؛ مقدار اول از دست میرود و هر دو خانه یکسان میشوند.
- علامت مقایسه را برعکس میگذارند و لیست از بزرگ به کوچک مرتب میشود.
تمرین بعدی
پایتون را قدمبهقدم یاد بگیرید
این تمرین یکی از تمرینهای پایتون با جواب دینا کد است. در دورهٔ پایتون از صفر هر مفهوم یک درس کوتاه دارد و تمرین هر درس با چند آزمون پنهان نمره میگیرد؛ درسهای اول رایگان است. برای امتحان کد آزاد هم اجرای آنلاین پایتون در دسترس است.