C++ 中 MergeSort 程序的错误输出
Wrong output of MergeSort program in C++
我正在尝试编写一个给出错误输出的基本合并排序代码。我的输入数组是 {4,2,6,1,9,5,6,78,9,34,74,86,14,3,0}
我得到的输出是 0 1 2 3 4 5 6 9 9 14 74 32696 802952496 1 1
这绝对是错误的,但我找不到代码的错误部分。
Sort
函数将数组一分为二,合并排序到初始数组中。
MergeSort
递归划分数组直到只剩下一个元素
#include <iostream>
#include <algorithm>
using namespace std;
void Sort(int *arr,int low,int mid,int high) //Sorting algo
{
int n1=mid-low+1,n2=high-mid;
int arr1[n1];
int arr2[n2];
for(int i=0;i<n1;i++)arr1[i]=arr[i+low];
for(int j=0;j<n2;j++)arr2[j]=arr[mid+j+1];
int i=0,j=0,it=low;
while(i<n1 && j<n2)
{
if(arr1[i]<=arr2[j])
{
arr[it]=arr1[i];i++,it++;
}
else
{
arr[it]=arr2[j];j++,it++;
}
}
while(i<n1){
arr[it]=arr1[i];i++;it++;
}
while(j<n2){
arr[it]=arr2[i];j++;it++;
}
}
void MergeSort(int* arr,int low,int high) //Recursive Merge Function
{
int mid=low+(high-low)/2;
if(low<high)
{
MergeSort(arr,low,mid);
MergeSort(arr,mid+1,high);
Sort(arr,low,mid,high);
}
}
int main() {
int arr[]={4,2,6,1,9,5,6,78,011,34,74,86,14,3,0};
int n=sizeof(arr)/sizeof(arr[0])-1;
MergeSort(arr,0,n);
for(int a:arr)
{
cout<<a<<" ";
}
return 0;
}
这里:
while(j<n2){
arr[it]=arr2[i];j++;it++;
}
应该是:
while(j<n2){
arr[it]=arr2[j];j++;it++;
}
怎么了?您正在访问索引 i
而不是 j
.
注:此类代码:
int n1=mid-low+1,n2=high-mid;
int arr1[n1];
int arr2[n2];
for(int i=0;i<n1;i++)arr1[i]=arr[i+low];
for(int j=0;j<n2;j++)arr2[j]=arr[mid+j+1];
丑,太丑了。请使用空格,它们是免费的!
我正在尝试编写一个给出错误输出的基本合并排序代码。我的输入数组是 {4,2,6,1,9,5,6,78,9,34,74,86,14,3,0}
我得到的输出是 0 1 2 3 4 5 6 9 9 14 74 32696 802952496 1 1
这绝对是错误的,但我找不到代码的错误部分。
Sort
函数将数组一分为二,合并排序到初始数组中。
MergeSort
递归划分数组直到只剩下一个元素
#include <iostream>
#include <algorithm>
using namespace std;
void Sort(int *arr,int low,int mid,int high) //Sorting algo
{
int n1=mid-low+1,n2=high-mid;
int arr1[n1];
int arr2[n2];
for(int i=0;i<n1;i++)arr1[i]=arr[i+low];
for(int j=0;j<n2;j++)arr2[j]=arr[mid+j+1];
int i=0,j=0,it=low;
while(i<n1 && j<n2)
{
if(arr1[i]<=arr2[j])
{
arr[it]=arr1[i];i++,it++;
}
else
{
arr[it]=arr2[j];j++,it++;
}
}
while(i<n1){
arr[it]=arr1[i];i++;it++;
}
while(j<n2){
arr[it]=arr2[i];j++;it++;
}
}
void MergeSort(int* arr,int low,int high) //Recursive Merge Function
{
int mid=low+(high-low)/2;
if(low<high)
{
MergeSort(arr,low,mid);
MergeSort(arr,mid+1,high);
Sort(arr,low,mid,high);
}
}
int main() {
int arr[]={4,2,6,1,9,5,6,78,011,34,74,86,14,3,0};
int n=sizeof(arr)/sizeof(arr[0])-1;
MergeSort(arr,0,n);
for(int a:arr)
{
cout<<a<<" ";
}
return 0;
}
这里:
while(j<n2){
arr[it]=arr2[i];j++;it++;
}
应该是:
while(j<n2){
arr[it]=arr2[j];j++;it++;
}
怎么了?您正在访问索引 i
而不是 j
.
注:此类代码:
int n1=mid-low+1,n2=high-mid;
int arr1[n1];
int arr2[n2];
for(int i=0;i<n1;i++)arr1[i]=arr[i+low];
for(int j=0;j<n2;j++)arr2[j]=arr[mid+j+1];
丑,太丑了。请使用空格,它们是免费的!