مرتبسازی ادغامی MergeSort مدرس: سید کمال الدین غیاثی شریازی ایده اصلی :ادغام دو لیست مرتب 2 الگوریتم ادغام ()Merge 3 )Merge( کد الگوریتم ادغام i=0; j=0; k=0; //( m:size B[], n:size A[], size of C is n+m) while (i < n && j < m){ if (A[i] <= B[j]) {C[k] = A[i]; i++;k++;} else {C[k] = B[j];j++;k++} } while (i < n) {C[k] = A[i];i++;k++;} while (j < m) {C[k] = B[i];j++;k++;} 4 الگوریتم بازگشتی مرتبسازی ادغامی void MergeSort(int A[],int p, int r) { if (r > p) { int q = (p + r) / 2; MergeSort (A, p, q); MergeSort (A, q+1, r); Merge (A, p, q, r); } } 5 محاسبه پیچیدگی زمانی MergeSort روش اول :جمع زدن مستقیم زمان ادغامها 6 به دست آوردن رابطه بازگشتی پیچیدگی زمانی MergeSort 7 محاسبه پیچیدگی زمانی MergeSort روش دوم :حل رابطه بازگشتی 8 قضیه اصلی ()Master Method فرض کنیم زمان اجرای یک تابع بازگشتی برابر ) T(nاست و در رابطه زیر صدق می کند: 𝑛 ) 𝑑𝑛(𝑂 𝑇(𝑛) ≤ 𝑎𝑇 ( ) + 𝑏 در این صورت داریم: 𝑎 𝑏 𝑖𝑓 𝑑 = log 𝑎 𝑏 𝑖𝑓𝑑 < log 𝑎 𝑏 𝑖𝑓𝑑 > log )𝑛 𝑂(𝑛𝑑 log ) 𝑎 𝑏𝑇(𝑛) ∈ { 𝑂(𝑛log ) 𝑑𝑛(𝑂 9 مبنای لگاریتم در تابع )𝒏(𝒈𝒐𝒍 𝒏 10 محاسبه پیچیدگی زمانی MergeSort روش سوم :استفاده از قضیه اصلی 11 نسخه غیر بازگشتی مرتبسازی ادغامی 12 الگوریتم مرتبسازی ادغامی غیر بازگشتی 13 پیچیدگی زمانی الگوریتم مرتبسازی ادغامی غیر بازگشتی 14 مرتبسازی ادغامی طبیعی ()Natural MergeSort 15 C++ STL stable_sort Function مرتبسازی ادغامی پایدار است. برای nهای کوچک ( )𝑛 ≤ 16مرتبسازی درجی سریعتر از مرتبسازی ادغامی است. stable_sort در C++ STLبرای nهای کوچک به الگوریتم مرتبسازی درجی برمیگردد. 16