如何解决使用递归分割数组排序故障故障核心转储
我最近一直在使用递归,并尝试使用该递归对数组进行排序,尽管使用递归可以很好地理解它。
我已经在这里声明了所有必要的功能
#include<iostream>
#include<stdlib.h>
#include<vector>
void insert(std::vector<int>&,int);
void sort(std::vector<int>&);
void getArray(std::vector<int>&,int,char **);
void display(const std::vector<int>&);
这是我的主要功能
int main(int argc,char **argv){
std::vector<int> array;
getArray(array,argc,argv);
sort(array);
display(array);
return 0;
}
这是我的排序恢复功能。
void sort(std::vector<int>& array){
if(array.size()==1)
return;
std::cout<<array.at(array.size()-1);
int temp = array.at(array.size()-1);
std::cout<<temp;
array.pop_back();
sort(array);
insert(array,temp);
}
插入功能
void insert(std::vector<int>& array,int temp)
{
if ((array.size()==0)||array.at(array.size()-1)<=temp)
array.push_back(temp);
int value = array.at(array.size()-1);
array.pop_back();
insert(array,temp);
array.push_back(value);
}
输入数组功能
void getArray(std::vector<int>& array,int argc,char **argv){
for (int i = 1;i<argc;i++){
array.push_back(atoi(argv[i]));
}
}
打印数组功能
void display(const std::vector<int>& array){
for (auto i : array){
std::cout<<i<<std::endl;
}
}
基本上,我使用逻辑来弹出数组的最后一个元素以进行递归排序,并在使用插入和排序功能最终排序之后添加弹出的元素。
但是我在运行时遇到了细分错误
$ g++ -std=c++14 -o main main.cpp
$ ./main 0 7 2 5 1 9
output : Segmentation fault (core dumped)
如果我输入
$ ./main 5
output : 5
即对于单个输入,我返回的是基本情况,但对于数组则不是。
解决方法
在插入中
,当((array.size()==0)||array.at(array.size()-1)<=temp)
为true时,您只需要array.push_back(temp)
而不执行其余功能,否则您将递归进行而不会结束并且有堆栈溢出>
例如:
void insert(std::vector<int>& array,int temp)
{
if ((array.size()==0)||array.at(array.size()-1)<=temp) {
array.push_back(temp);
}
else {
int value = array.at(array.size()-1);
array.pop_back();
insert(array,temp);
array.push_back(value);
}
}
此后(由于没有std::cout<<std::endl
,因此无法删除 sort 中的调试输出),编译和执行:
pi@raspberrypi:/tmp $ g++ -Wall s.cc
pi@raspberrypi:/tmp $ ./a.out 0 7 2 5 1 9
0
1
2
5
7
9
pi@raspberrypi:/tmp $
除此之外
- 请勿使用 atoi ,
atoi("aze")
静默返回0。 - 您的排序方式非常昂贵(事实上
std::sort
已经存在) - C ++ 14甚至C ++ 11都没有,编译的标记/方式没有用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。