合并排序实施无法正常工作
Merge Sort implementation not working as expected
我一直在尝试实现合并排序;但是实现以某种方式不正确 - 输出包含不是原始数组的一部分的值。我尝试将其与其他人的实现(工作(进行比较,但似乎找不到错误。
代码是: -
#include <iostream>
using namespace std;
void Merge (int A[], int lo, int hi, int mid){
int i = lo;
int k = 0;
int j = mid+1;
int R[hi-lo];
while(i<=mid && j<=hi){
if(A[i]<A[j]){
R[k]=A[i];
cout << A[i] << "; " << A[j] << " " << i << " " << j << endl;
i++;
}else {
R[k]=A[j];
cout << A[i] << "; " << A[j] << " " << i << " " << j << endl;
j++;
}k++;
}
while(i<=lo){
R[k]=R[i];
i++;k++;
}
while(j<=hi){
R[k]=R[j];
j++;k++;
}
int count =0;
for(i=lo; i<hi; i++){
A[i]=R[count];
count++;
cout << count << " ; " << i << "-/-/-/-/-/-/-" << flush;
}
}
void mergeSort(int A[], int lo, int hi){
//if(hi-lo+1<2)return;
if (lo<hi){
int mid = (lo+hi)/2;
mergeSort(A, lo, mid);
mergeSort(A, mid+1, hi);
Merge (A, lo, hi, mid);}
}
int main(){
int A[] = {1,5,3,4,8,9,150,7,51,65};
int hi = sizeof(A)/sizeof(int);
cout << hi << endl;
mergeSort(A,0, hi);
cout << endl << endl << endl << endl;
for(int i=0; i<=hi; i++){
cout<<A[i]<< "; " << flush;
}
return 0;
}
我试图搜索类似的Q(s(,但找不到一个。
实现的问题是边界包含和错误的数组的混合。
首先,查看合并中循环的最后两个时,您做了: R[k]=R[i];
当您表示R[k]=A[i];
在同一函数上,您的循环缺少迭代,循环保护应为 i<=hi
而不是 i<hi
。
HI的初始化也是错误的,因为您将其初始化为元素的数量而不是最后一个索引,因此您应该减去-1。
也不知道您的打印代码在做什么,所以我发表了评论并添加了自己的印刷代码,我发现了更清楚的。
我纠正您的代码如下:
#include <iostream>
using namespace std;
void Merge (int A[], int lo, int hi, int mid){
int i = lo;
int k = 0;
int j = mid+1;
int R[hi-lo];
cout << "input" << endl;
for(int i=lo; i<=mid; i++)
cout << A[i] << " ";
cout << endl;
for(int i=mid+1; i<=hi; i++)
cout << A[i] << " ";
cout << endl;
while(i<=mid && j<=hi){
if(A[i]<A[j]){
R[k]=A[i];
//cout << A[i] << "; " << A[j] << " " << i << " " << j << endl;
i++;
}else {
R[k]=A[j];
//cout << A[i] << "; " << A[j] << " " << i << " " << j << endl;
j++;
}k++;
}
while(i<=mid){
R[k]=A[i];
i++;k++;
}
while(j<=hi){
R[k]=A[j];
j++;k++;
}
int count =0;
for(i=lo; i<=hi; i++){
A[i]=R[count];
count++;
//cout << count << " ; " << i << "-/-/-/-/-/-/-" << flush;
}
cout << "output:" << endl;
for(int i=lo; i<=hi; i++)
cout << A[i] << " ";
cout << endl;
}
void mergeSort(int A[], int lo, int hi){
//if(hi-lo+1<2)return;
if (lo<hi){
int mid = (lo+hi)/2;
mergeSort(A, lo, mid);
mergeSort(A, mid+1, hi);
Merge (A, lo, hi, mid);}
}
int main(){
int A[] = {1,5,3,4,8,9,150,7,51,65};
int hi = sizeof(A)/sizeof(int) -1;
cout << hi << endl;
mergeSort(A,0, hi);
cout << endl << endl << endl << endl;
for(int i=0; i<=hi; i++){
cout<<A[i]<< "; " << flush;
}
return 0;
}
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程