پروژه برنامه نویسی Merge Sort ( مرتب سازی ادغامی ) به زبان سی پلاس پلاس
پروژه برنامه نویسی Merge Sort ( مرتب سازی ادغامی ) به زبان سی پلاس پلاس
سورس کد پروژه برنامه نویسی Merge Sort ( مرتب سازی ادغامی ) به زبان سی پلاس پلاس در محیط کنسول
پروژه ی دانشجویی درس برنامه نویسی نرم افزار در مقطع کارشناسی رشته ی مهندسی کامپیوتر و مهندسی فناوری اطلاعات ( IT )
پروژه برنامه نویسی Merge Sort ( مرتب سازی ادغامی ) به زبان سی پلاس پلاس
شرح پروژه:
برنامه ای به زبان سی پلاس پلاس و در محیط کنسول بنویسید که آرایه ای از اعداد را با استفاده از روش مرتب سازی ادغامی مرتب کند. خروجی برنامه باید شامل اعضای آرایه قبل و بعد از مرتب سازی باشد.
معرفی مرتب سازی ادغامی:
مرتبسازی ادغام یک الگوریتم مرتبسازی تطبیقی با زمان اجرای میباشد. در اکثر پیادهسازیها این الگوریتم پایدار میباشد. بدین معنی که این الگوریتم ترتیب ورودیهای مساوی را در خروجی مرتب شده حفظ میکند. این یک مثال از الگوریتم تقسیم و تسخیر میباشد. این الگوریتم در سال ۱۹۴۵ توسط جان فون نویمان اختراع شدهاست.
الگوریتم
از نظر مفهومی یک الگوریتم مرتبسازی ادغام بدین صورت کار میکند:
- اگر طول لیست ۰ یا ۱ باشد آن پیش از این مرتب شدهاست در غیر این صورت
- لیست نامرتب را به دو زیرلیست که اندازهٔ آنها در حدود نصف سایز لیست اولیهاست تقسیم میکند.
- هر زیرلیست را بهطور بازگشتی با صدا کردن merge sort مرتب میکند.
- دو تا دوتا زیر لیستها را از آخر ادغام میکند تا به یک لیست برسد.
مرتبسازی ادغام ۲ تا ایدهٔ اصلی را با هم ترکیب میکند تا زمان اجرایش تقویت شود.
- یک لیست کوچک از گامهای کمتری برای مرتبکردن نسبت به یک لیست بزرگ استفاده میکند.
- یرای مرتب کردن دو لیست مرتبشده نسبت به دو لیست نامرتب گامهای کمتری نیاز میباشد به عنوان مثال اگر این لیستها مرتب باشند شما مجبور هستید تا هر لیست را فقط یکبار پیمایش کنید.
این الگوریتم بازگشتیست.
مثال
مجموعه <A=<۵،۲،۴،۷،۱،۳،۲،۶ را با استفاده از الگوریتم مرتبسازی ادغام مرتب کنید.
ابتدا این آرایه را نصف میکنیم پس دو آرایه به طول ۴ بدست میآید، که برابر است با (۵،۲،۴،۷) و(۱،۳،۲،۶) سپس این روال را تا جایی ادامه میدهیم که که طول آرایههایمان برابر یک شود؛ که برابر است با: (۶)(۲)(۳)(۱)(۷)(۴)(۲)(۵) حال به صورت زیر آنها را با هم ادغام میکنیم تا به آرایه اصلی مان برسیم.
تحلیل
در مرتب کردن n تا عنصر مرتبسازی ادغام در حالت میانگین و بدترین حالت دارای زمان اجرای میباشد. اگر زمان اجرای مرتبسازی ادغام برای یک لیست به طول باشد بنابراین رابطهٔ بازگشتی از تعریف الگوریتم پیروی میکند. در این الگوریتم هر دفعه لیست را به دو زیرلیست تقسیم میکنیم و در هر مرحله n تا گام برای ادغام کردن لازم میباشد.
این شکل از رابطه، از قضیه اصلی واکاوی الگوریتمها پیروی میکند. در بدترین حالت این الگوریتم تقریباً (n ⌈lg n⌉ – ۲⌈lg n⌉ + ۱) مقایسه دارد که بین ((nlgn+n+O(n) و (nlgn-n+۱) میباشد. برای n بزرگ و یک لیست که به صورت تصادفی مرتب شدهاست یعنی ممکن است به هر ترتیبی باشد تعداد مقایسه مورد انتظار merge sort بهαn کمتر از بدترین حالت میرسد که α از رابطهٔ روبرو بدست میآید:
در بدترین حالت تعداد مقایسههای مرتبسازی ادغام حدود ۰/۳۹ کمتر از مرتبسازی سریع در حالت متوسط میباشد. مرتبسازی ادغام همیشه تعداد مقایسههای کمتری را نسبت به مرتبساز سریع احتیاج دارد، به جز در حالتی که تمام عناصر ورودی برابر باشند جایی که بدترین حالت مرتبسازی ادغام همراه با بهترین حالت مرتبسازی سریع پیدا میشود. پیچیدگی مرتبسازی ادغام در بدترین حالت از (O(nlgn میباشد که با بهترین حالت مرتبسازی سریع برابر میباشد اما در بهترین حالت تعداد مقایسهها نصف تعداد مقایسهها در بدترین حالت میباشد. در پیادهسازی بازگشتی مرتبسازی ادغام در بدترین حالت ۲n-۱ بار تابع مرتبسازی ادغام صدا زده میشود در حالی که در مرتبسازی سریع تابع مورد نیاز n بار صدا زده میشود. پیادهسازی غیر بازگشتی مرتبسازی ادغام از هزینهٔ سربار فراخوان تابع جلوگیری میکند که این کار سخت نمیباشد پیادهسازی رایج مرتبسازی ادغام به صورت درجا میباشد بنابراین سایز حافظه ورودی باید برای خروجی مرتب شده تخصیص داده شود. مرتبسازی درجا ممکن میباشد اما بسیار پیچیدهاست و در عمل از کارایی کمتری برخوردار میباشد حتی اگر در زمان nlgn اجرا شود. در این مواقع الگوریتمهایی شبیه مرتبسازی هرمی با سرعت قابل مقایسه پیشنهاد میشود که ازپیچیدگی کمتری برخوردار میباشد. برخلاف ادغام استاندارد ادغام درجا پایدار نیست.
ویژگیهای مرتبسازی ادغامی
۱- پیچیدگی زمانی اجرای الگوریتم در تمامی حالات (Ө(n log n است. چرا که این الگوریتم تحت هر شرایطی آرایه را به دو قسمت کرده و مرتبسازی را انجام میدهد.
۲- پیچیدگی حافظه مصرفی بستگی به روش پیادهسازی مرحله ادغام دارد، که تا (O(n افزایش مییابد. پیادهسازی درجای این الگوریتم حافظه مصرفی مرتبه (Ө(۱ دارد. اما اجرای آن در بدترین حالت زمانبر است.
۳- الگوریتم مرتبسازی ادغامی با پیادهسازی فوق یک روش پایدار است. چنین الگوریتمی ترتیب عناصر با مقدار یکسان را پس از مرتبسازی حفظ میکند.
مقایسه با سایر الگوریتمها
اگر چه مرتبسازی هرمی زمان اجرای مرتبسازی ادغام را دارد و فضای معین (Θ(۱ را در مقابل مرتبسازی ادغام که به فضای (Θ(nرا نیاز دارد دارا میباشد و آن در اغلب پیادهسازیهای خاص سریع تر است و هم چنین اگر چه مرتبسازی سریع از نظر خیلیها سریعترین الگوریتم همه منظوره در نظر گرفته میشود اما در نگاه کلی مرتبسازی ادغام پایدار است و بهتر به صورت موازی جفت میکندو هم چنین در اداره کردن دستیابی به میانههای پشت سرهم کاراتر است. merge sort اغلب بهترین انتخاب برای مرتب کردن یک لیست پیوندی (Linked-List) میباشد در این موقعیت آسان است که مرتبسازی ادغام را به گونهای پیادهسازی کنیم که آن فقط به فضای اضافهای به اندازهٔ (Θ(۱ نیاز داشته باشد. کارایی دستیابی تصادفی یک لیست پیوندی باعث میشود تا بعضی از الگوریتمها مانند مرتبسازی سریع ضعیف عمل کنند یا بعضیها مانند مرتبسازی هرمی غیرممکن شود.