Uploaded by s.jafarzadeh78

3 Merge Sort

advertisement
‫مرتبسازی ادغامی‬
‫‪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‬‬
Download