تابع merge که اینجا code شده همون چیزی که دوستمون نوشته بود فقط شاید یکم خوانا تر باشه .
فقط یک مشکلی هست. فرض کنید ما اینقدر لیست اصلی را تقسیم کردیم که به سه زیر لیست
27,10,12 می رسیم.اشاره گر اولی (h) به 27 دومی(l) به 10 و سومی(j) به 12 اشاره دارد. mid1=1 و mid2=2 است.
بعد 10 بعنوان کوچکترین عنصر در شرط if چهارمی صدق می کند. مقدارl برار 3 میشود ودیگر وارد if دومی نمی شویم. و باید a[j] و a[h]مقایسه شوند.در صورتی که ما هر بار مقایسه با a[l] هم داریم. واین باعث ایجاد مشکل می شود. اگر trace کنید معلوم میشود.

void merge (float a[], int start, int mid1, int mid2, int end)
{ int i, j, k,l,h;
float tmp[end-start+1];
h = start;
i = start;
l = mid1+1;
j = mid2+1;
for(k=0;k++;k<=end){
if (h<=mid1)//h must be between start..mid1
if ((a[h]<=a[l]) && (a[h]<=a[j]))//is a[h] the smallest in the three sublist
tmp[i++] = a[h++];

if (l<=mid2)//l must be between mid1+1..mid2
if ((a[l]<=a[h]) && (a[l]<=a[j]))//is a[l] the smallest in the three sublist
tmp[i++] = a[l++];

if (j<=end)//j must be between mid2+1..end
if ((a[j]<=a[h]) && (a[j]<=a[l]))//is a[j] the smallest in the three sublist
tmp[i++] = a[j++];
}//end for
}//end merge