C++ c+中的3路合并排序堆栈溢出错误+;

C++ c+中的3路合并排序堆栈溢出错误+;,c++,visual-c++,mergesort,C++,Visual C++,Mergesort,大家好,有人能告诉我我的3路mergesort代码有什么问题吗?我编写的代码只能对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

大家好,有人能告诉我我的3路mergesort代码有什么问题吗?我编写的代码只能对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
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
常数int size=4;
向量s(大小);
无效合并(int,int,int);
无效合并排序(int,int);
int main(){

对于(int i=0;i,这里是对代码的部分检查。我相信调试带有4个值的3向合并排序时会出现问题。您应该使用更多的值,例如6或7

空格不是StackOverflow的制表符
我猜缩进是因为您在代码中使用了制表符并直接粘贴。您将希望在下一篇文章中展开制表符

预编译标题
您的项目庞大吗?当您更改标题或修改源代码时,它是否显著缩短了构建时间

我发现
stdafx
通常比较麻烦,解决它所导致的缺陷所花费的时间抵消了使用预编译头所带来的任何潜在节约

函数原型应使用命名参数
您能告诉您的
merge
mergeSort
声明中不同参数的用途吗?
“模棱两可滋生缺陷。”努夫说

主函数声明错误。
main
函数总是向操作系统返回一个
int
。操作系统可以忽略它

这种机制可以让脚本文件执行程序并测试错误

可读性可防止缺陷
投资于运算符周围的空格。牺牲空格所节省的时间可以忽略不计。使用易于阅读的代码所节省的调试时间是巨大的,尤其是在让其他人查看或检查您的代码时

使用中间变量
中间变量有助于澄清您的程序。当您告诉编译器进行优化时,它们不会占用内存。在调试期间,它们可以帮助在计算期间显示值

读入向量的典型习惯用法是:

  int value;
  cin >> value;
  s.push_back(value);
at
方法可能存在溢出问题(或者至少您没有检查越界问题)。
push_back
方法将导致向量根据需要展开

有意义的变量名可以减少缺陷
变量
s
没有任何意义。像
原始值
数字容器
这样的变量更具描述性。同样,变量名称长度与提高性能无关。可读名称有助于减少注入的缺陷

不检查
cin的状态

如果我输入“Lion”以响应您的第二次提示,那么阵列的第二个插槽中会有什么?
不要相信用户,他们并不完美

不清除屏幕
它可能包含有用的数据,例如实际输入的数字。因此,当您调试时,如果您想知道用户实际输入的内容,它将永远丢失

为什么要吃两次?
你在没有提示的情况下请求用户输入。并且两次。你的程序和用户之间的恶果

如果要在收到特定字符之前忽略字符,请参见
cin.ignore
。可能类似于:

  cout << "Paused. Press Enter to continue.\n";
  cin.ignore(100000, '\n');  
cout一个“经典”的3路合并排序一次运行3次,在源数组和目标数组(或向量或列表)之间交替运行。代码最多需要执行3次比较,以确定“最小”从3次运行中的每一次运行中选择3个值,然后将最小值从其对应的运行移动到目标数组。代码还必须处理到达运行结束的情况,只剩下2次运行要合并,然后到达第二次运行结束的情况,在这种情况下,第三次运行的其余部分将移动到目标数组


对于基于ram的排序,我不确定这是否比正常的2路合并快。对于具有多个设备或非常大的读写量的外部排序,则k路合并(k最多为12或16)会更快。

根据缩进判断,我猜是
}不是你认为它是你的缩进是什么问题。先考虑修复它。我不打算尝试读取那个代码;可能的DUPE。可能是因为你错误地定义了代码> main < /Code >:<代码> int main(空格)。
main
函数总是返回一个
int
。我不明白。你可以用U来不打字,但你可以正确地拼写较长的单词,如“感激”。如果你很匆忙,你会尝试缩短所有单词。如果你想清楚地交流,你会用
You
而不是“U”。是的,是的我不明白。