我最近一直在使用递归,并尝试使用相同的方法对数组进行排序,尽管使用递归来很好地理解它。
我已经在这里声明了所有必要的功能
#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)
是的,你只需要 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
,所以您看不到),编译和执行: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("aze")
静默返回 0。std::sort
已经存在)关于c++ - 使用递归段错误核心转储对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63434750/