c++ - 使用递归段错误核心转储对数组进行排序

标签 c++ arrays sorting recursion c++14

我最近一直在使用递归,并尝试使用相同的方法对数组进行排序,尽管使用递归来很好地理解它。
我已经在这里声明了所有必要的功能

#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,atoi("aze")静默返回 0。
  • 您的排序方式非常昂贵(事实上std::sort 已经存在)
  • C++14 甚至 C++11 都没有特定的东西,编译的标签/方式是没用的
  • 关于c++ - 使用递归段错误核心转储对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63434750/

    相关文章:

    c++ - 用户定义的函数仅返回可能值中的 1 个

    c++ - C++内联函数可以调用稍后在 header 中声明的函数吗?

    c - 这个数组定义为静态而不是全局的是什么?

    java - Arrays.asList 在 Java 中没有扁平化,我应该使用什么代替?

    javascript - 如何使用 jquery json 获取多个下拉菜单

    vba - 在 VBA 中对多个键进行排序;运行时错误 450 : Wrong number of arguments or invalid property assignment

    c++ - 在 Xcode 6.3 中使用 Boost C++?

    javascript - jQuery 表格排序更改按列排序的颜色 :

    c - 链表冒泡排序

    c++ - "?"和 ":"序列实际调用的是什么?