无法在Mergesort中发现错误

时间:2014-12-16 11:11:32

标签: c

l& h对应于1st&的指数。数组a中的最后一个元素: - 各个分区和合并功能运行良好。请解释两个功能的链接中发生的错误。

#include <stdio.h>
void mergesort(int a[], int l, int h);
void merge (int a[], int l, int m, int h);
int main ()
{
    int a[] = {5,4,9,0,8,6,1,3,2,7}, i;
    mergesort (a, 0, 5);
    for (i = 0; i < 10; i++)
        printf ("%d ", a[i]);
    return 0;
}
void mergesort(int a[], int l, int h) 
{
    if (l == h)
    return;
    int m = (l + h) / 2;
    mergesort (a, l, m);
    mergesort (a, m + 1, h);
    merge(a, l, m, h);
}
void merge (int a[], int l, int m, int h)
{
    int t[h - l + 1], i = l, j = m + 1, k = 0;
    while (i <= m && j <= h) {
        if (a[i] < a[j]){
            t[k] = a[i];
            k++;
            i++;
        }
        if (a[j] < a[i]) {
            t[k] = a[j];
            j++;
            k++;
        }
    }
    if (i != m) {
        while (i <= m) {
            t[k] = a[i];
            k++;
            i++;
        }
    }
    if (j != h) {
        while (j <= h) {
            t[k] = a[j];
            k++;
            j++;
        }
    }
    for (i = 0; i <= (h - l); i++)
        a[l + i] = t[i];
    }

而不是所需的输出

0 4 5 6 8 9 1 3 2 7

(元素0到5包含变为排序),它会产生一些像

这样的垃圾
0 4 6 9 2686712 32 1 3 2 7

1 个答案:

答案 0 :(得分:1)

if (i != m)if (j != h)必须为if (i <= m)if (j <= h)

此外,您也可以省略它们,因为它们是多余的(仅保留while条件)。 更少的代码,更少的错误。