【发布时间】:2014-07-20 17:01:33
【问题描述】:
大家好,谁能告诉我我的 3 路归并排序代码有什么问题?我写的代码只能对 4 个数字进行排序,如果你给它超过 4 个数字(通过改变大小)它最终会出现堆栈溢出错误,这里是代码:
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
const int size=4;
vector <int> s(size);
void merge(int,int,int);
void mergesort(int,int);
int main(){
for(int i=0;i<size;i++){
cout<<"enter number "<<i+1<<":";
cin>>s.at(i);
}
system("CLS");
cout<<"here are the unsorted numbers:\n";//prints the input values so U can see'em
for(int j=0;j<size;j++)
cout<<s.at(j)<<".";
mergesort(0,size-1);//calls mergesort
cout<<"\nhere are the sorted numbers:\n";
for(int j=0;j<size;j++)
cout<<s.at(j)<<".";
cin.get();
cin.get();
return 0;
}
void merge(int low,int one_third,int high){
int i=low;
int j=one_third+1;
int k=0;
int length=(high-low)+1;
vector <int> u(length,0);
if(k<length){
while((i<=one_third)&&(j<=high)){
if(s.at(i)<=s.at(j)){
u.at(k)=s.at(i);
i++;
k++;
}//end for
else{
u.at(k)=s.at(j);
j++;
k++;
}//end elseif
}//end while
if(j>high)
while(i<=one_third)
{
u.at(k)=s.at(i);
i++;
k++;
}
if(i>one_third)
while(j<=high)
{
u.at(k)=s.at(j);
j++;
k++;
}
for(int n=low;n<k;n++)
s.at(n)=u.at(n);
}
}//end if
void mergesort(int low,int high){
if(low<high){
int one_third=(high-low)/3;//division,it's 3-way mergesort so obviously it's divided by 3
int two_third=2*one_third;
mergesort(low,one_third);
mergesort(one_third+1,two_third);
mergesort(two_third+1,high);
merge(low,one_third,two_third);
merge(low,two_third,high);
}//end if
}
此时我想我已经完成了思考,任何答案/想法将不胜感激。
【问题讨论】:
-
从缩进来看,我猜
}不是你想的那样 -
您的缩进有问题。考虑先修复它。
-
我不会尝试阅读该代码;可能是stackoverflow.com/questions/12030683/… 的欺骗。
-
这可能是因为您错误地定义了
main:int main(void)。main函数总是返回int。 -
我不明白。您使用 U 来不键入 you,但可以正确拼写较长的单词,例如 appreciated。如果你赶时间,你会尽量缩短所有的单词。如果您的目标是清晰地交流,您将使用
you而不是“U”。是的,不明白。
标签: c++ visual-c++ mergesort