合并排序无法正常工作?

时间:2015-10-18 08:03:40

标签: c arrays sorting merge

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函数有问题,请帮我找到解决方案。

2 个答案:

答案 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)