C++ 合并排序不正确的输出

C++ 合并排序不正确的输出,c++,sorting,C++,Sorting,我尝试使用下面的合并排序函数对数组进行排序。然而,它并没有给我预期的输出。 它不会打印出正确/预期的输出,即 输入:5,4,3,2,1 产量:1,2,3,4,5 相反,它给出:2,3,4,5,1,9,8,7,8,4,1,8,8,2 #include <iostream> #include <cmath> #include <ctime> #include <cstdlib> using namespace std; void mergeSort

我尝试使用下面的合并排序函数对数组进行排序。然而,它并没有给我预期的输出。 它不会打印出正确/预期的输出,即

输入:5,4,3,2,1
产量:1,2,3,4,5

相反,它给出:2,3,4,5,1,9,8,7,8,4,1,8,8,2

#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>

using namespace std;

void mergeSort(int a[], int low , int high,int res[]);
void merge(int a[], int low , int mid , int high,int res[]);
void mergeSort(int numbers[], int temp[], int array_size);

const int SIZE=5;

int main () {

    int sorted[SIZE];
    for (int i=0; i<SIZE; i++) {
        cout << "input numbers" <<endl;
        cin >>sorted[i];
    }
    int merge[SIZE];

    mergeSort(sorted,merge,SIZE);

    for (int i=0; i<SIZE; i++) {
        cout << merge[i];
    }

    return 0;
}

void mergeSort(int numbers[], int temp[], int array_size)
{
    mergeSort(numbers, 0, array_size-1, temp);
}

void mergeSort(int a[], int low , int high,int res[])
{
    int mid = (low + high)  /2;
    if (low + 1 < high)
    {
        //  Sort sub-parts
        mergeSort(a,low,mid,res);
        mergeSort(a,mid,high,res);

        //  Merge back to "res"
        merge(a,low,mid,high,res);
    }else{
        res[low] = a[low];
    }
}

void merge(int a[], int low , int mid , int high,int res[])
{
    int i = low;
    int j = mid;
    int k = low;   //  Use "low" instead of 0.

    while (i < mid && j < high)
        if(a[i] < a[j])
            res[k++] = a[i++];
        else
            res[k++] = a[j++];

    while (i < mid)
        res[k++] = a[i++];

    while (j < high)
        res[k++] =a[j++];

    //  Copy back to "a"
    for (int c = low; c < high; c++){
        a[c] = res[c];
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
void mergeSort(int a[],int low,int high,int res[]);
无效合并(整数a[],整数低,整数中,整数高,整数分辨率[]);
无效合并排序(整数[],整数温度[],整数数组大小);
常数int SIZE=5;
int main(){
整数排序[大小];

对于(int i=0;i根据示例代码,结果只应打印5个数字(因为const int SIZE=5)

除此之外,请注意,您将列表中最后一个元素的位置作为“high”参数提供

但是,在merge函数中,while(j
更新:需要调整合并函数末尾的for循环,以便将最后一个(“high”)元素复制回数组a。

根据示例代码,结果只应打印5个数字(因为const int SIZE=5)

除此之外,请注意,您将列表中最后一个元素的位置作为“high”参数提供

但是,在merge函数中,while(j
更新:需要调整合并函数末尾的for循环,以便将最后一个(“high”)元素复制回数组a中。

我认为这是问题的根源--

应该是

    //  Sort sub-parts
    mergeSort(a,low,mid,res);
    mergeSort(a,mid+1,high,res);
另外,如果(低+1<高)
应更改为
if(低<高)


此外,
while(i
应该是
while(i我认为这是造成问题的原因--

应该是

    //  Sort sub-parts
    mergeSort(a,low,mid,res);
    mergeSort(a,mid+1,high,res);
另外,如果(低+1<高)
应更改为
if(低<高)


此外,
while(i
应该是
while(i在处理索引限制时有点混乱

表示范围的两种非常常见的方法是:

  • 范围限制指向元素之间
  • 范围限制指向元素
  • 在图片中,上面的编号使用“元素之间的指向”方法,灰色范围为
    (2,5)

    下面的编号使用的是“指向元素”方法,相同的范围是
    (2,4)

    作为个人喜好,我喜欢“元素之间”方法更多:例如,范围的大小是
    高-低
    ,您可以很容易地表示空范围,甚至是反转范围。但是,重要的是,在编写管理范围的代码时,如果使用第一种或第二种方法,请始终保持头脑清晰

    在您的代码中存在这种混淆;例如,在
    mergesort
    中,您正在检查

    low + 1 < high
    
    低+1<高
    
    这意味着您正在使用“元素间”方法,因为当
    高-低=1
    时,意味着只有一个元素,不需要排序。此外,您递归传递
    (低,中)
    (中,高)
    :另一个明确的标志是“元素间”之所以使用这种方法,是因为您肯定不想在数组[mid]
    中来回移动两次

    但是,在相同的代码中,您在主程序中传递函数
    0
    array_size-1
    ,这是一个明显的迹象,表明在这种情况下,您使用的是“指向元素”方法


    只需再次检查所有索引和范围的使用是否一致,代码就可以了。

    在处理索引限制时有点混乱

    表示范围的两种非常常见的方法是:

  • 范围限制指向元素之间
  • 范围限制指向元素
  • 在图片中,上面的编号使用“元素之间的指向”方法,灰色范围为
    (2,5)

    下面的编号使用的是“指向元素”方法,相同的范围是
    (2,4)

    作为个人喜好,我喜欢“元素之间”方法更多:例如,范围的大小是
    高-低
    ,您可以很容易地表示空范围,甚至是反转范围。但是,重要的是,在编写管理范围的代码时,如果使用第一种或第二种方法,请始终保持头脑清晰

    在您的代码中存在这种混淆;例如,在
    mergesort
    中,您正在检查

    low + 1 < high
    
    低+1<高
    
    这意味着您正在使用“元素间”方法,因为当
    高-低=1
    时,意味着只有一个元素,不需要排序。此外,您递归传递
    (低,中)
    (中,高)
    :另一个明确的标志是“元素间”之所以使用这种方法,是因为您肯定不想在数组[mid]
    中来回移动两次

    但是,在相同的代码中,您在主程序中传递函数
    0
    array_size-1
    ,这是一个明显的迹象,表明在这种情况下,您使用的是“指向元素”方法


    只需再次检查所有索引和范围的使用是否一致,代码就可以了。

    一个很好的例子…一个很好的例子…我将它改为jDon。不要忘记合并函数末尾的for循环,它将res数组复制回a。另请看下面hrv的答案。现在的代码只包含两个元素,将失败.我将其更改为jDon。别忘了merge函数末尾的for循环,它将res数组复制回a中。还可以查看hrv的a