تبليغاتX
مرجع کامل کنکور - کاردانی به کارشناسی - کارشناسی ارشد
 
.
 
دوشنبه هفدهم اردیبهشت 1386 :: 20:47 ::  نويسنده : Mojtaba Karimi

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

 

مرتب سازی حبابی که به آن مرتب سازی جابجایی یا Exchange Sort نیز می گویند ، یکی از ساده ترین الگوریتم های مرتب سازی است. نحوه کار این الگوریتم به این صورت است که هر دو خانه آرایه طی مراحل مکرر مقایسه می شوند و اگر در جای اشتباه بودند با هم تعویض می شوند. این کار تا مرتب شدن تمام عناصر آرایه ادامه می یابد. فلسفه نامگذاری این الگوریتم آن است که حبابهای آب به صورت مرحله به مرحله به سطح آب می آیند و عناصر آرایه نیز مانند این حبابها و از طریق جابجا شدن با عنصر کناری خود به سر جای صحیح خود می روند. به این دلیل که اصلی ترین عملیات در این الگوریتم ، مقایسه کردن می باشد ، این الگوریتم در گروه مرتب سازی های مقایسه ای قرار می گیرد. مرتب سازی حبابی ساده ترین نوع از این گروه می باشد.

یک روش ساده برای بیان این الگوریتم ، در شبه کد ( pseudocode ) زیر آمده است :

 

                    

 

تحلیل الگوریتم :

 

بدترین حالت زمانی ( Worst-case )

مرتب سازی حبابی با آرایه ای به طول n دارای پیچیدگی زمانی    در بدترین حالت (Worst case)  است. برای درک این مطلب فرض کنید بزرگترین عنصر آرایه در آخرین خانه قرار دارد. هر گذر در این الگوریتم ، این عنصر را تنها یک خانه به جلو می برد. بنابراین برای آنکه عنصر مورد نظر در جای اصلی خود یعنی اولین خانه قرار بگیرد باید  n-1 بار آرایه را طی کنیم. همانطور که در هر گذر باید کل آرایه را طی کنیم و هر گذر نیز  n-1  بار اجرا می شود ، بنابراین تعداد عملیات در بدترین حالت برابر است با :

 

بهترین حالت زمانی ( Best-case )

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

 

نمودار مجانبی مرتب سازی حبابی به صورت زیر است :

 

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

 

پیاده سازی های دیگر

 

یک راه برای بهینه کردن bubblesort  توجه به این نکته است که بعد از هر گذر ، بزرگترین عنصر همیشه به انتهای لیست حرکت خواهد کرد. طی هر مقایسه ، واضح است که بزرگترین عنصر به سمت پایین خواهد رفت. اگر طول آرایه را n فرض کنیم ، تضمین خواهد شد که n امین عنصر در جای صحیح خود قرار دارد. حال باید n-1 عنصر باقیمانده را مرتب کنیم. دوباره بعد از هر گذر ، n-1 امین عنصر در جای صحیح خود قرار خواهد گرفت. و الی آخر.

در شبه کد زیر ، تغییرات گفته شده اعمال شده است :

 

                    

 

ما می توانیم عمل مقایسه را برای آرایه ای با طول کمتر انجام دهیم ، یعنی در هر گذر یک خانه کاهش می یابد. بطور دقیق تر ، بجای  مقایسه ( و جابجایی ) ، تنها لازم است که  n + (n-1) + (n-2) + ... + 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


Page Rank Check
Yahoo bot last visit powered by MyPagerank.Net Msn bot last visit powered by MyPagerank.Net