بررسي الگوريتم مرتبسازي ادغامي
یک شنبه 6 شهریور 1390 12:39 PM
روش کار الگوريتم مرتبسازي ادغامي ابتدا فهرستي از دادهها که قرار است مرتب شوند به 2 فهرست به طول مساوي تقسيم ميشوند و سپس فهرستهاي توليد شده به روش بازگشتي با صدا زدن تابع MergSort هر کدام به دو زيرفهرست تقسيم ميشوند. اين عمل آنقدر ادامه پيدا ميکند تا به فهرستهايي برسيم که طول هر کدام ? باشد. تمام زيرفهرستهاي توليدشده مرتب ميشوند و سپس از پايين به بالا با فهرستهاي مجاور خود ادغام شده و فهرست جديدي توليد ميشود. اين فهرستها نيز با فهرستهاي مجاور خود ادغام ميشوند. آن قدر اين فهرستها با هم ترکيب ميشوند تا به فهرست نهايي برسيم. در هر ادغام مرتب بودن دادهها حفظ ميشود. حال اين روش را با يک مثال توضيح ميدهيم. فرض کنيد دادههاي ما مجموعهاي به نام A است که بهصورت زير تعريف شده است: A = { 5,2,4,7,1,3,2,6} ابتدا مجموعه A را به 2 زيرمجموعه با طول يکسان به نامهاي A1و A2 تقسيم ميکنيم: A1={5,2,4,7}, A2={ 1,3,2,6} سپس هر کدام از اين مجموعهها را به 2 مجموعه با طول مساوي تقسيم كرده و در نهايت به ? مجموعه بهصورت زير ميرسيم: B={5,2}, C={4,7}, D={1,3}, E={2,6} از مجموعههاي بالا فقط مجموعه B نياز به مرتبسازي دارد. پس از مرتب کردن جدول B بايد مجموعهها را با هم ادغام کنيم. عمل ادغام به اين صورت است که ابتدا اولين عنصر از هر دو مجموعه را با هم مقايسه كرده و عنصر کوچکتر را در مجموعه سومي قرار ميدهيم که همان خروجي اين مرحله است. سپس عنصر بعدي را از همان مجموعهاي انتخاب ميکنيم که عنصر اول که در مجموعه سوم قرار گرفته است. سپس اين عمل را آنقدر ادامه ميدهيم که تمامي عناصر يکي از 2 مجموعه در مجموعه سومي که نتيجه حاصل از ادغام دو مجموعه در آن ذخيره شده است، قرار بگيرد. سپس باقي عناصر مجموعه دوم به ترتيب به مجموعه سوم منتقل ميشود. شبهکد اين الگوريتم بهصورت زير است: function merge_sort(m) { var list left, right, result if length(m) «= 1 return m 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} پيچيدگي زماني الگوريتم مرتبسازي ادغامي اگر زمان لازم براي مرتبسازي آرايه Nعضوي به روش ادغام برابر (T(N باشد داريم: T(N) = 2T(N/2) + N در اين الگوريتم در هر مرحله آرايه به 2 آرايه شکسته ميشود و در هر مرحله از ادغام نيز بايد N مقايسه صورت بگيرد. در نتيجه در بدترين حالت تعداد مقايسههاي اين الگوريتم برابر (n[log n] -2[log n] +1) است و چون عمل غالب در اين الگوريتم مانند باقي الگوريتمهاي مرتبسازي عمل مقايسه است. پس مرتبه اجرايي اين الگوريتم برابر (o(nlogn است. اين الگوريتم در بدترين حالت ?? بار سريعتر از الگوريتم مرتبسازي حبابي (Bubble sort) است. در جاهايي بدترين حالت اين الگوريتم از لحاظ زماني برابر بهترين حالت الگوريتم سريع (Quick sort) با دادههاي يکسان است. اميربهاالدين سبطالشيخ
چهار راه برای رسیدن به آرامش:
1.نگاه کردن به عقب و تشکر از خدا 2.نگاه کردن به جلو و اعتماد به خدا 3.نگاه کردن به اطراف و خدمت به خدا 4.نگاه کردن به درون و پیدا کردن خدا
پل ارتباطی : samsamdragon@gmail.com
تالارهای تحت مدیریت :
مطالب عمومی کامپیوتراخبار و تکنولوژی های جدیدسیستم های عاملنرم افزارسخت افزارشبکه