0

配列をソートしたい。だから私はこのマージソートを書きました、それは私が望むことをしません、つまりソートします、ただ失速します! 私はアルゴリズムを何度も見直していますが、これはとても正しいと思いますが、違います! 見て、何が間違っているのか教えてください。

void mergeSort(int *arr, int low, int high){
int mid = (low+high)/2;
while(low<high){
    mergeSort(arr, low, mid);
    mergeSort(arr, mid+1, high);
    merge(arr, low, high, mid);
}
}

void merge(int *arr,int low, int high, int mid){
int i =low,j=mid+1,k=0;
int temp[50];  // should i new/malloc this with size of ( high -low +1) ?
while(i<=mid && j<=high){
    if(arr[i]<arr[j])
        temp[k++] = arr[i++];
    else
        temp[k++] = arr[j++];
}
while(i<=mid)
    temp[k++] = arr[i++];
while(j<=high)
    temp[k++] = arr[j++];
for(int x = 0; x<=high; x++){
    arr[x]=temp[x];
}
}
4

1 に答える 1

3
void mergeSort(int *arr, int low, int high){
    int mid = (low+high)/2;
    while(low<high){

ループに入ると、どちらも変更されないため、無限ループになりlowますhigh

        mergeSort(arr, low, mid);
        mergeSort(arr, mid+1, high);
        merge(arr, low, high, mid);
    }
}

void merge(int *arr,int low, int high, int mid){
    int i =low,j=mid+1,k=0;
    int temp[50];  // should i new/malloc this with size of ( high -low +1) ?

はい、間違いなく正しい量のストレージを割り当てる必要があります。

    while(i<=mid && j<=high){
        if(arr[i]<arr[j])

arr[i] <= arr[j]sには関係ありませんが、安定した並べ替えを行う方がよいでしょうint

            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    }
    while(i<=mid)
        temp[k++] = arr[i++];
    while(j<=high)
        temp[k++] = arr[j++];
    for(int x = 0; x<=high; x++){

そうあるべきですfor(int x = low; ...

        arr[x]=temp[x];

arr[x] = temp[x-low];(または 2 つのインデックスを使用します)。

    }
}
于 2013-01-27T23:06:26.710 に答える