0

私はmergesortのために次のコードを書こうとしています。コードの何が問題なのか誰か教えてください:-

#include<stdio.h>
#include<stdlib.h>

int arr[100];

void merge(int low,int mid,int high)
{
    int temp[100],lowind = low,highind = mid+1,i=0;
    while(lowind <= mid && highind<=high)
    {
        if(arr[lowind]<arr[highind])
        {
            temp[i] = arr[lowind];
            i++;
            lowind++;
        }
        else
        {
            temp[i] = arr[highind];
            i++;
            highind++;
        }
    }

    while(lowind<=mid)
    {
        temp[i] = arr[lowind];
        i++;
        lowind++;
    }

    while(highind<=high)
    {
        temp[i] = arr[highind];
        i++;
        highind++;
    }

    for(i=low;i<=high;i++)
        arr[i] = temp[i-low];
}

void divider(int low,int high)
{
    int mid = (low+high)/2;
    if(low<mid)
    {
        divider(low,mid);
        divider(mid+1,high);
        merge(low,mid,high);
    }
}

int main()
{
    int i,j,temp;

    for(i=0;i<20;i++)
        arr[i] = rand()%21;

    for(i=0;i<20;i++)
        printf("%d ",arr[i]);
    printf("\n");

    divider(0,19);

    for(i=0;i<20;i++)
            printf("%d ",arr[i]);
    printf("\n");

    return 0;
}
4

3 に答える 3

2

で、あなたが書いたようにではなくvoid divider(int low,int high)する必要があります。if(low<high)if(low<mid)

理由を知るために、low = 2、high = 3、ここではmid =(low + high)/ 2 = 5/2=2のようなケースを理解してみてください。したがって、あなたの状態は失敗します。

于 2012-10-31T05:55:23.483 に答える
1

除算器関数の条件チェックをif(low<high)代わりに変更するだけですif(low<mid)

于 2012-10-31T06:05:16.963 に答える
-1

1、arr[i] = rand()%21; 実数列の乱数を取得することは可能ですか? srand (time(0)) の次に rand () を使用してください。他の言語では、rand(時間) も適切です。2、分周器の場合、(低

于 2012-10-31T06:29:02.420 に答える