合并排序输出不正确

时间:2015-01-27 17:03:02

标签: c++ mergesort

所以,我已经遇到了一些问题,但我认为自己已经取得了重大进展。尝试过很多东西。但是我无法得到这个输出正确的值我概念上理解合并排序,但编码它让我感到困惑。所以...如果我输入:

5 1 7 4 6 9

而不是:14569,我得到了(我无法弄清楚原因): 11414761467  **另外,作为一个问题,是否有一种简单的方法可以循环使用一组数字,以便在这种情况下不需要换行?

#include <iostream>
using namespace std;

void merge(int[], int, int, int);

void mergesort(int array[], int low, int high)
{
    int mid;
    if(low < high){
        mid = low + (high-low)/2;
        mergesort(array, low, mid);
        mergesort(array, mid+1, high);
        merge(array, low, mid, high);
    }
}

void merge(int array[], int low, int mid, int high)
{
    int h, i, j, b[high], k;
    h = low;
    i = low;
    j = mid + 1;
    while((h <= mid) && (j <= high)){
        if(array[h] <= array[j]){
            b[i] = array[h];
            h++;
        }
        else{
            b[i] = array[j];
            j++;
        }
        i++;
    }
    if( h > mid){
        for(k = j; k <= high; k++){
            b[i] = array[k];
            i++;
        }
    }
    else{
        for(k = h; k <= mid; k++){
            b[i] = array[k];
            i++;
        }
    }
    for( k = low; k <= high; k++){
        array[k] = b[k];
    }
    for(int i = 0; i < high; i++){
        cout << array[i];
    } 
}

int main()
{
    int size;
    cin >> size;
    int data[size];
    for(int i = 0; i < size; i++){
        cin >> data[i] ;
    }
    mergesort(data, 0, size-1);
}

还有一种方法来cin&gt;&gt; data [i]不必在每一个之后按Enter键,但不使用向量?非常感谢。

1 个答案:

答案 0 :(得分:2)

你在merge()的每次递归中打印,这就是为什么你这样做的原因,因为打印发生在合并发生时,并且不打印最终结果。

for(int i = 0; i < high; i++){
    cout << array[i];
} 

要避免这种情况,请在main中打印合并的数组。


我的意思是将您的计划更改为:

#include <iostream>
using namespace std;

void merge(int[], int, int, int);

void mergesort(int array[], int low, int high)
{
    int mid;
    if(low < high){
        mid = (high+low)/2;
        mergesort(array, low, mid);
        mergesort(array, mid+1, high);
        merge(array, low, mid, high);
    }
}

void merge(int array[], int low, int mid, int high)
{
    int h, i, j, b[high], k;
    h = low;
    i = low;
    j = mid + 1;
    while((h <= mid) && (j <= high)){
        if(array[h] <= array[j]){
            b[i] = array[h];
            h++;
        }
        else{
            b[i] = array[j];
            j++;
        }
        i++;
    }
    if( h > mid){
        for(k = j; k <= high; k++){
            b[i] = array[k];
            i++;
        }
    }
    else{
        for(k = h; k <= mid; k++){
            b[i] = array[k];
            i++;
        }
    }
    for( k = low; k <= high; k++){
        array[k] = b[k];
    }
}

int main()
{
    int size;
    cin >> size;
    int data[size];
    for(int i = 0; i < size; i++){
        cin >> data[i] ;
    }
    mergesort(data, 0, size-1);
    for(int i = 0; i < size; i++){
        cout << data[i];
    } 
}