C++ 合并排序不正确的输出
我尝试使用下面的合并排序函数对数组进行排序。然而,它并没有给我预期的输出。 它不会打印出正确/预期的输出,即 输入:5,4,3,2,1C++ 合并排序不正确的输出,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
产量: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