مرتبسازی ادغامی
مرتبسازی ادغام یک الگوریتم مرتبسازی تطبیقی با زمان اجرای
میباشد. در اکثر پیاده سازیها این الگوریتم پایدار میباشد. بدین معنی که این الگوریتم ترتیب ورودیهای مساوی را در خروجی مرتب شده حفظ میکند. این یک مثال از الگوریتم تقسیم و تسخیر میباشد. این الگوریتم در سال ۱۹۴۵ توسط جان فون نویمان اختراع شدهاست.
محتویات |
الگوریتم [ویرایش]
از نظر مفهومی یک الگوریتم مرتبسازی ادغام بدین صورت کار میکند:
۱ -اگر طول لسیت ۰ یا ۱ باشد آن پیش از این مرتب شدهاست در غیر این صورت
۲-لیست نامرتب را به دو زیرلیست که اندازهٔ آنها در حدود نصف سایز لیست اولیهاست تقسیم میکند.
۳-هر زیرلیست را به طور بازگشتی با صدا کردن merge sort مرتب میکند.
۴-دو تا دوتا زیر لیستها را از آخر ادغام میکند تا به یک لیست برسد.
مرتب سازی ادغام ۲ تا ایدهٔ اصلی را با هم ترکیب میکند تا زمان اجرایش تقویت شود.
۱-یک لیست کوچک از گامهای کمتری برای مرتبکردن نسبت به یک لیست بزرگ استفاده میکند.
۲-یرای مرتب کردن دو لیست مرتبشده نسبت به دو لیست نامرتب گامهای کمتری نیاز میباشد به عنوان مثال اگر این لیستها مرتب باشند شما مجبور هستید تا هر لیست را فقط یکبار پیمایش کنید.
مثال [ویرایش]
مجموعه <A=<۵،۲،۴،۷،۱،۳،۲،۶ را با استفاده از الگوریتم مرتب سازی ادغام مرتب کنید.
ابتدا این آرایه را نصف می کنیم پس دو آرایه به طول ۴ بدست میآید، که برابر است با (۵،۲،۴،۷) و(۱،۳،۲،۶) سپس این روال را تا جایی ادامه می دهیم که که طول آرایههایمان برابر یک شود.که برابر است با: (۶)(۲)(۳)(۱)(۷)(۴)(۲)(۵) حال به صورت زیر آنها را با هم ادغام می کنیم تا به آرایه اصلی مان برسیم.

تحلیل [ویرایش]
در مرتب کردن n تا عنصر مرتب سازی ادغام در حالت میانگین و بدترین حالت دارای زمان اجرای (nlgn) میباشد.اگر زمان اجرای مرتبسازی ادغام برای یک لیست به طول
باشد بنابراین رابطهٔ بازگشتی
از تعریف الگوریتم پیروی میکند. در این الگوریتم هر دفعه لیست را به دو زیرلیست تقسیم میکنیم و در هر مرحله n تا گام برای ادغام کردن لازم میباشد.
این شکل از رابطه ، از تئوری قضیه اصلی پیروی میکند. در بدترین حالت این الگوریتم تقریبا (n ⌈lg n⌉ - ۲⌈lg n⌉ + ۱) مقایسه دارد که بین ((nlgn+n+O(n) و (nlgn-n+۱) میباشد. برای n بزرگ و یک لیست که به صورت تصادفی مرتب شدهاست یعنی ممکن است به هر ترتیبی باشد تعداد مقایسه مورد انتظار mergsort بهαn کمتر از بدترین حالت میرسد که α از رابطهٔ روبرو بدست میآید: 
در بدترین حالت تعداد مقایسههای مرتبسازی ادغام حدود ۰/۳۹ کمتر از مرتب سازی سریع در حالت متوسط میباشد. مرتبسازی ادغام همیشه تعداد مقایسههای کمتری را نسبت به مرتبساز سریع احتیاج دارد، به جز در حالتی که تمام عناصر ورودی برابر باشند جایی که بدترین حالت مرتبسازی ادغام همراه با بهترین حالت مرتب سازی سریع پیدا میشود. پیچیدگی مرتبسازی ادغام در بدترین حالت از (O(nlgn میباشد که با بهترین حالت مرتبسازی سریع برابر میباشد اما در بهترین حالت تعداد مقایسهها نصف تعداد مقایسهها در بدترین حالت میباشد. در پیادهسازی بازگشتی مرتبسازی ادغام در بدترین حالت ۲n-۱ بار تابع مرتبسازی ادغام صدا زده میشود در حالی که در مرتبسازی سریع تابع مورد نیاز n بار صدا زده میشود. پیاده سازی غیر بازگشتی مرتبسازی ادغام از هزینهٔ سربار فراخوان تابع جلوگیری میکند که این کار سخت نمیباشد پیادهسازی رایج مرتبسازی ادغام به صورت درجا میباشد بنابراین سایز حافظه ورودی باید برای خروجی مرتب شده تخصیص داده شود. مرتبسازی درجا ممکن میباشد اما بسیار پیچیدهاست و در عمل از کارایی کمتری برخوردار میباشد حتی اگر در زمان nlgn اجرا شود. در این مواقع الگوریتمهایی شبیه مرتب سازی هرمی با سرعت قابل مقایسه پیشنهاد میشود که ازپیچیدگی کمتری برخوردار میباشد. برخلاف ادغام استاندارد ادغام درجا پایدار نیست.
ویژگیهای مرتبسازی ادغامی
1- پیچیدگی زمانی اجرای الگوریتم در تمامی حالات ( Ө( n log n است. چرا که این الگوریتم تحت هر شرایطی آرایه را به دو قسمت کرده و مرتبسازی را انجام میدهد.
2- پیچیدگی حافظه مصرفی بستگی به روش پیادهسازی مرحله ادغام دارد، که تا ( O( n افزایش مییابد. پیادهسازی درجای این الگوریتم حافظه مصرفی مرتبه ( Ө( 1 دارد. اما اجرای آن در بدترین حالت زمانبر است.
3- الگوربتم مرتبسازی ادغامی با پیادهسازی فوق یک روش پایدار است. چنین الگوریتمی ترتیب عناصر با مقدار یکسان را پس از مرتبسازی حفظ میکند.
مقایسه با سایر الگوریتمها [ویرایش]
اگر چه مرتب سازی هرمی زمان اجرای مرتب سازی ادغام را دارد و فضای معین (Θ(۱ را در مقابل مرتب سازی ادغام که به فضای (Θ(nرا نیاز دارد دارا میباشد و آن در اغلب پیاده سازیهای خاص سریع تر است و هم چنین اگر چه مرتب سازی سریع از نظر خیلیها سریعترین الگوریتم همه منظوره در نظر گرفته میشوداما در نگاه کلی مرتب سازی ادغام پایدار است و بهتر به صورت موازی جفت میکندو هم چنین در اداره کردن دستیابی به میانههای پشت سرهم کاراتر است.mergsort اغلب بهترین ابتخاب برای مرتب کردن یک لیست پیوندی (Linked-List) میباشد در این موقعیت آسان است که مرتب سازی ادغام را به گونهای پیاده سازی کنیم که آن فقط به فضای اضافهای به اندازهٔ (Θ(۱ نیاز داشته باشد. کارایی دستیابی تصادفی یک لیست پیوندی باعث میشود تا بعضی از الگوریتمها مانند مرتب سازی سریع ضعیف عمل کنند یا بعضیها مانند مرتب سازی هرمی غیر ممکن شود.
در یک شبه کد ساده الگوریتم به شکل زیر میباشد:
function merge_sort(m) { var list left, right, result if length(m) <= 1 return m // This calculation is for 1-based arrays. For 0-based, use length(m)/2 var middle = length(m) / 2 for each x in m up to middle add x to left for each x in m after middle add x to right left = merge_sort(left) right = merge_sort(right) result = merge(left, right) return result } function merge(left, right) { var list result while length(left) > 0 and length(right) > 0 if first(left) <= first(right) append first(left) to result left = rest(left) else append first(right) to result right = rest(right) end while while length(left) > 0 append left to result while length(right) > 0 append right to result return result}
منابع [ویرایش]
- ویکیپدیا ی انگلیسی
- مقدمهای بر الگوریتمها - پدیدآورنده: تامس کورمن، چارلز لیزرسان، رونالد دیوست، کلیفورد اشتاین - گروه مهندسی-پژوهشی خوارزمی (مترجم) - ناشر: درخشش
|
|||||||||||||||||||||||||||||||