【问题标题】:quickSort segmentation fault (core dumped)quickSort 分段错误(核心转储)
【发布时间】:2017-03-14 08:24:59
【问题描述】:

我知道我的问题有多个答案,我理解为什么会这样,但我的主要问题是如何克服这个错误。我知道我正在尝试访问我无法访问的内存,但我只是不知道我是如何做到这一点的。

#include <iostream>
#include <string> 
#include <stdlib.h>
using namespace std;

int arr[] = {4,5,2,1,3};
int lengd = sizeof(arr)/sizeof(arr[0]);

void swapNumber(int arr[], int i, int j){
     int tmp = arr[i];
     arr[i] = arr[j];
     arr[j] = tmp;
}

void partition(int arr[], int i, int j){
     int pivot = arr[j];
     while (i <= j) {
          while (arr[i] < pivot){
               i++;
          }
          while (arr[j] > pivot){
               j--;
          }
          if (i <= j) {
               swapNumber(arr, i, j);
               i++;
               j--;
          }
     }
}

void quickSort(int arr[], int left, int right) {
      int i = left;
      int j = right;

      partition(arr,left,right);


      if (left < j){
          quickSort(arr,left, j);
      }
      if (i < right){
          quickSort(arr, i, right);
      }
}

int main(){
    quickSort(arr,0, lengd-1);

    for(int i = 0; i < 5; i++){
        cout << arr[i] << endl;
     }
}

当我在 quickSort 函数内运行 quickSort 函数时发生错误。我不知道该怎么办。

【问题讨论】:

  • 您是否尝试过在调试器中运行以捕捉正在发生的崩溃,并在您的代码中找到它发生的位置?当崩溃发生时,所有涉及的变量的值是多少?递归深度是多少(即调用堆栈上有多少递归调用)?您是否尝试过使用诸如 Valgrind 之类的内存调试器来帮助您?
  • @pergy 这是一个让浏览器崩溃的恶作剧。 Firefox 不能很好地处理它。
  • @Someprogrammerdude 哈哈,不好意思。我从评论中删除链接
  • 或者至少在你的分区函数中放一个std::cout &lt;&lt; i &lt;&lt; ", " &lt;&lt; j &lt;&lt; std::endl;,看看发生了什么

标签: c++ recursion quicksort core


【解决方案1】:

由于您的号码不会在 partition 函数中被修改,您应该更改其签名以接收 reference

void partition(int arr[], int& i, int& j)

一切都会好起来的。

使用调试器或放置良好的控制台消息很容易发现此类缺陷!

【讨论】:

  • 谢谢你,你真的帮了我,给我展示了一个很酷的新把戏:)
猜你喜欢
  • 2015-06-25
  • 2021-06-03
相关资源
最近更新 更多