|
.
|
||
|
دوشنبه هفدهم اردیبهشت 1386 :: 20:47 :: نويسنده : Mojtaba Karimi مرتب سازی حبابی : مرتب سازی حبابی که به آن مرتب سازی جابجایی یا Exchange Sort نیز می گویند ، یکی از ساده ترین الگوریتم های مرتب سازی است. نحوه کار این الگوریتم به این صورت است که هر دو خانه آرایه طی مراحل مکرر مقایسه می شوند و اگر در جای اشتباه بودند با هم تعویض می شوند. این کار تا مرتب شدن تمام عناصر آرایه ادامه می یابد. فلسفه نامگذاری این الگوریتم آن است که حبابهای آب به صورت مرحله به مرحله به سطح آب می آیند و عناصر آرایه نیز مانند این حبابها و از طریق جابجا شدن با عنصر کناری خود به سر جای صحیح خود می روند. به این دلیل که اصلی ترین عملیات در این الگوریتم ، مقایسه کردن می باشد ، این الگوریتم در گروه مرتب سازی های مقایسه ای قرار می گیرد. مرتب سازی حبابی ساده ترین نوع از این گروه می باشد. یک روش ساده برای بیان این الگوریتم ، در شبه کد ( pseudocode ) زیر آمده است :
تحلیل الگوریتم : بدترین حالت زمانی ( Worst-case ) مرتب سازی حبابی با آرایه ای به طول n دارای پیچیدگی زمانی
بهترین حالت زمانی ( Best-case ) مرتب سازی حبابی در بهترین حالت زمانی دارای پیچیدگی
نمودار مجانبی مرتب سازی حبابی به صورت زیر است :
پیاده سازی های دیگر یک راه برای بهینه کردن bubblesort توجه به این نکته است که بعد از هر گذر ، بزرگترین عنصر همیشه به انتهای لیست حرکت خواهد کرد. طی هر مقایسه ، واضح است که بزرگترین عنصر به سمت پایین خواهد رفت. اگر طول آرایه را n فرض کنیم ، تضمین خواهد شد که n امین عنصر در جای صحیح خود قرار دارد. حال باید n-1 عنصر باقیمانده را مرتب کنیم. دوباره بعد از هر گذر ، n-1 امین عنصر در جای صحیح خود قرار خواهد گرفت. و الی آخر. در شبه کد زیر ، تغییرات گفته شده اعمال شده است :
ما می توانیم عمل مقایسه را برای آرایه ای با طول کمتر انجام دهیم ، یعنی در هر گذر یک خانه کاهش می یابد. بطور دقیق تر ، بجای سریع تر می باشد.
اگرچه مرتب سازی حبابی یکی از ساده ترین و قابل فهم ترین الگوریتم ها می باشد ، اما دارای پیچیدگی زمانی به علت سادگی ، مرتب سازی حبابی اغلب برای معرفی مفهوم یک الگوریتم ، یا یک الگوریتم مرتب سازی و حتی آموزشهای مقدماتی برای دانشجویان علوم کامپیوتر استفاده می شود. با این وجود ، بعضی از محققین مانند Owen Astrachan عملیات سنگینی را روی این الگوریتم پیاده کردند ( مانند طول آرایه بسیار زیاد ) تا ثابت کنند که این الگوریتم ناکارآمد است و نباید در آموزش علوم کامپیوتر مورد استفاده قرار گیرد. Donald Knuth در کتاب مشهورش “The Art of Computer Programming” ، مرتب سازی حبابی را این گونه تفسیر می کند : " به نظر می رسد که مرتب سازی حبابی به غیر از یک نام جذاب و حقیقتی که منجر به طرح بعضی مسائل نظری جالب می شود ، چیزی برای عرضه ندارد." مرتب سازی حبابی از نظر مجانبی معادل زمان اجرای مرتب سازی درجی در بدترین حالت است ، اما دو الگوریتم از نظر تعداد جابجایی ها به شدت با هم فرق می کنند. نتایج عملی مانند کاری که Astrachan انجام داد نشان می دهد که مرتب سازی درجی حتی بر روی آرایه های تصادفی نیز بهتر عمل می کند. به همین دلیل ، بسیاری از کتب درسی جدید ، دیگر از مرتب سازی حبابی استفاده نمی کنند و بجای آن مرتب سازی درجی را آموزش می دهند. همچنین مرتب سازی حبابی با CPU های مدرن بطور ضعیفی تعامل می کنند. مرتب سازی حبابی حداقل دو برابر مرتب سازی درجی احتیاج به نوشتن دارد و در نتیجه دو برابر آن نیز cache را هدر می دهد و به صورت مجانبی باعث branch mispredictions یا عدم پیش بینی شاخه ای می شود. تحقیقات به عمل آمده توسط Astrachan بر روی مرتب سازی رشته ها در Java نشان می دهد که مرتب سازی حبابی 5 برابر از مرتب سازی درجی و حدود 40% از مرتب سازی انتخابی کندتر است.
توجه : برای مشاهده تصاویر به صورت متحرک یا Gif بر روی آنها کلیک کنید.
تصویر ۱ : در این شکل ۵ عنصر به صورت مرحله به مرحله مرتب می شوند:
تصویر ۲ : در این تصویر مرتب سازی حبابی همراه با اجرای همزمان کد نمایش داده می شود. به نظر من این تصویر برای آموزش بسیار مناسب است زیرا همزمان می توانید نحوه اجرای کد را نیز ببینید.
تصویر ۳ : این تصویر و تصاویر بعدی به صورت میله ای می باشند. یعنی ارتفاع هر میله بیانگر مقدار آن است.
تصویر ۴ :
تصویر ۵ : و این هم آخرین تصویر که خیلی کوچک و گویا است.
امیدوارم تو این پست تونسته باشم قدم مفیدی در این زمینه بر داشته باشم. از دوستان عزیز خواهشمندم من رو از پیشنهادات و انتقادات خودشون محروم نکنند.
در پست بعدی در مورد مرتب سازی درجی بحث خواهم کرد.
درباره وبلاگ
![]() در این وبلاگ در مورد درس ذخیره و بازیابی اطلاعات و نیز مطالبی جامع در خصوص کنکورهای کاردانی به کارشناسی و کارشناسی ارشد بحث خواهد شد. امیدواریم بتوانیم قدمی هر چند کوچک در جهت پیشرفت علوم کامپیوتر برداریم. مجتبی کریمی Y! ID : Kingmojtaba2006 Mojtaba.Karimi010@gmail.com ![]() آرشيو وبلاگ
![]() پیوندهای روزانه
![]() پيوندها
![]() |
||