我尝试使用矢量为学校项目创建合并排序。没有得到想要的输出
I tried creating merge sort using vectors for a school project. Didn't get the desired output
#include<iostream>
#include<vector>
using namespace std;
void sort(vector <int> &v, int i, int j, int end2)
{
vector <int> v1;
int start1=i, start2=j, end1=j;
while((start1<end1)||(start2<end2))
{
if((start1<end1)&&(start2<end2))
{
if(v[start1]<v[start2])
{
v1.push_back(v[start1]);
start1++;
}
else if (v[start1]==v[start2])
{
v1.push_back(v[start1]);
start1++;
start2++;
}
else
{
v1.push_back(v[start2]);
start2++;
}
}
else if((start1<end1)&&(start2>=end2))
{
v1.push_back(v[start1]);
start1++;
}
else if((start1>=end1)&&(start2<end2))
{
v1.push_back(v[start2]);
start2++;
}
}
int s=i;
while(s<end2)
{
v[i]=v1[i];
i++;
}
}
void mergeSort(vector <int> &v, int s)
{
int low, end2, high;
for(int k=2;k<=s;k=k*2)
{
for(int i=0;i+k-1<s;i=i+k)
{
low=i;
high=i+k;
end2=i+2*k;
sort(v, low, high, end2);
}
}
}
int main()
{
vector <int> v;
int n;
cout<<"Enter the no. of elements you want to sort\n";
cin>>n;
int d;
cout<<"Enter the values\n";
for(int i=0;i<n;i++)
{
cin>>d;
v.push_back(d);
}
int s= v.size();
mergeSort(v, s);
for(int i=0;i<n;i++)
{
cout<<v[i]<<"\t";
}
cout<<endl;
}
所以我在代码块上写了这段代码,当我尝试执行它时,它要求我输入要排序的值。我输入这些值,突然屏幕显示分段错误并关闭程序。请帮助我更正此代码以进行合并排序。我最近开始使用 stls 并在使用它们时感到困惑。
这段代码是做什么用的?
int s=i;
while(s<end2)
{
v[i]=v1[i];
i++;
}
恕我直言,应该删除。
这个代码不应该
else if (v[start1]==v[start2])
{
v1.push_back(v[start1]);
start1++;
start2++;
}
真的是这个吗?
else if (v[start1]==v[start2])
{
v1.push_back(v[start1]);
v1.push_back(v[start2]);
start1++;
start2++;
}
否则你的最终数组会比原来的数组短。
深思熟虑,如前所述,您应该使用调试器进行调查。
#include<iostream>
#include<vector>
using namespace std;
void sort(vector <int> &v, int i, int j, int end2)
{
vector <int> v1;
int start1=i, start2=j, end1=j;
while((start1<end1)||(start2<end2))
{
if((start1<end1)&&(start2<end2))
{
if(v[start1]<v[start2])
{
v1.push_back(v[start1]);
start1++;
}
else if (v[start1]==v[start2])
{
v1.push_back(v[start1]);
start1++;
start2++;
}
else
{
v1.push_back(v[start2]);
start2++;
}
}
else if((start1<end1)&&(start2>=end2))
{
v1.push_back(v[start1]);
start1++;
}
else if((start1>=end1)&&(start2<end2))
{
v1.push_back(v[start2]);
start2++;
}
}
int s=i;
while(s<end2)
{
v[i]=v1[i];
i++;
}
}
void mergeSort(vector <int> &v, int s)
{
int low, end2, high;
for(int k=2;k<=s;k=k*2)
{
for(int i=0;i+k-1<s;i=i+k)
{
low=i;
high=i+k;
end2=i+2*k;
sort(v, low, high, end2);
}
}
}
int main()
{
vector <int> v;
int n;
cout<<"Enter the no. of elements you want to sort\n";
cin>>n;
int d;
cout<<"Enter the values\n";
for(int i=0;i<n;i++)
{
cin>>d;
v.push_back(d);
}
int s= v.size();
mergeSort(v, s);
for(int i=0;i<n;i++)
{
cout<<v[i]<<"\t";
}
cout<<endl;
}
所以我在代码块上写了这段代码,当我尝试执行它时,它要求我输入要排序的值。我输入这些值,突然屏幕显示分段错误并关闭程序。请帮助我更正此代码以进行合并排序。我最近开始使用 stls 并在使用它们时感到困惑。
这段代码是做什么用的?
int s=i;
while(s<end2)
{
v[i]=v1[i];
i++;
}
恕我直言,应该删除。
这个代码不应该
else if (v[start1]==v[start2])
{
v1.push_back(v[start1]);
start1++;
start2++;
}
真的是这个吗?
else if (v[start1]==v[start2])
{
v1.push_back(v[start1]);
v1.push_back(v[start2]);
start1++;
start2++;
}
否则你的最终数组会比原来的数组短。
深思熟虑,如前所述,您应该使用调试器进行调查。