void mergeSubArr(int arr[], int lb, int mid, int ub){
int temp[size], i = lb, j = mid, k = 0;
while(i<mid && j<=ub){
if(arr[i] <= arr[j])
temp[k] = arr[i++];
else
temp[k] = arr[j++];
k++;
}
while(i<mid)
temp[k++] = arr[i++];
while(j<=ub)
temp[k++] = arr[j++];
for(k=0;k<size;k++)
arr[k] = temp[k];
}
void mergeArr(int num[], int lb, int ub){
int mid;
if((ub-lb)>1){
mid = (lb+ub)/2;
mergeArr(num, lb, mid);
mergeArr(num, mid+1, ub);
mergeSubArr(num, lb, mid+1, ub);
}
}
当调用函数mergeArr时,输出正在输出一些最初不存在于数组中的其他元素?我认为mergeSubArr函数有问题,请帮我找到解决方案。
答案 0 :(得分:0)
您的算法基本上有两个问题:
从索引0填充数组temp
。稍后,您需要将其复制到arr
,但从下限开始。您也不应该复制size
元素,因为您无法确定原始数组是否包含size
个元素。 (谢谢,BLUEPIXY,发现这个。)你应该确保size
足够大以容纳所有元素。
你的上限是包容性的。这意味着if (ub - lb > 1)
捕获了有两个以上元素的情况。你仍然需要处理有两个元素的情况,这两个元素可能是错误的顺序,通过制定上述条件ub - lb > 0
或者通过使用else子句来交换元素,如果它们的顺序错误
所以做出这些改变:
int temp[size], i = lb, j = mid, k = lb;
从下限开始临时数组。
for(k = lb; k <= ub; k++)
arr[k] = temp[k];
仅复制相关子阵列。
if (ub - lb > 0) ...
抓住有两个元素的情况。
就个人而言,当通过指针算法和长度传递子数组时,我发现mergesort算法更容易。它放弃了许多补偿。
答案 1 :(得分:0)
一切都很好。而是if((ub-lb)>1)
只需替换
if((ub-lb)>0)
OR
if(ub > lb)