为什么我的quicksort程序会崩溃?

时间:2012-09-14 18:25:10

标签: c++ quicksort

下面给出了我能想到的快速排序技术的代码。我不确定它是否正确,但根据我的逻辑,我猜它应该可以正常工作。但是,我认为我过分夸大了,因为当我尝试在DevC ++上运行此代码时,它会崩溃并关闭程序。每个程序都不会发生这种情况,因此这个代码显然存在一些问题。

#include<iostream.h>
#include<conio.h>

int quick(int, int);

int split(int beg, int end);

int a[7] = { 43, 6, 235, 76, 23, 65, 29 };

int main() {
    quick(0, 6);
    getch();
    return 1;
}

int quick(int beg, int end) {
    //trial for self coding

    int loc = split(beg, end);
    quick(beg, loc - 1);//first half
    quick(loc + 1, end);//second half

    //end of coding

    cout << "\nThe sorted array is :\t";
    for (int i = 0; i < 7; i++)
        cout << a[i] << "\t";
    return 0;
}

//SPLIT FUNC STARTS
int split(int beg, int end) {
    int temp, loc, left, right, count = 1;
    left = beg;
    right = end;
    loc = beg;
    while (left != right) {
        if ((count % 2) != 0) {
            while (a[loc] <= a[right]) {
                right--;
            }
            if (loc == right)
                return loc;
            if (a[loc] > a[right]) {
                temp = a[loc];
                a[loc] = a[right];
                a[right] = temp;
                loc = right;
                left++;
                count++;
                continue;
            }
        }// end of count%2 if
        else {
            while (a[left] <= a[loc])
                left++;
            if (loc == left)
                return loc;
            if (a[loc] < a[left]) {
                temp = a[loc];
                a[loc] = a[right];
                a[right] = temp;
                loc = left;
                right--;
                count++;
                continue;
            }
        }//end of else
    }// end of while
    return loc;
}

2 个答案:

答案 0 :(得分:3)

使用调试标志编译程序并在调试器中运行它。大多数IDE都提供“调试”按钮。 GCC允许您使用-g选项编译调试标志,您可以使用gdb。

在这种情况下,我用g++ -g quicksort.cpp && gdb a.out做了后者。有一次,我使用了run。这立刻给了我一个“无法访问内存”。错误与行号完成。 print <variable>将打印变量,quit将退出。

我特意没有提供实际的错误位置信息用于教育目的。

答案 1 :(得分:3)

编译错误

我把它放在一个文件中并用:

编译
g++ -g yourcode.cpp

第一个问题:

yourcode.cpp:1:21: fatal error: iostream.h: No such file or directory
compilation terminated.

其次是:

yourcode.cpp: In function ‘int quick(int, int)’:
yourcode.cpp:23:5: error: ‘cout’ was not declared in this scope
yourcode.cpp:23:5: note: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: note:   ‘std::cout’

而不是#include <iostream.h>,您应该#include <iostream>。您还需要using namespace std;您的编译器可能已经过时了。大多数编译器都是免费的,所以我强烈建议你在学习时不要让你犯这样的错误。我有一段时间没有使用Windows,但可能 Eclipse 的工作原理相同,而且 Visual Studio Express 也是免费的。我认为 Qt Creator 也适用于Windows。选择其中任何一个,只需停止使用您现在使用的那个

我还删除了你要调用的奇怪的DOS输入函数来暂停程序。如果您想要输入,请使用std::cin

分段错误

现在,如果我运行它,我得到:

Segmentation fault (core dumped)

这很有趣,gdb说什么?

Starting program: /home/brendan/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x00000000004008b7 in split (beg=0, end=6) at yourcode.cpp:55
55              while (a[left] <= a[loc])

这表示在第55行的某个时刻,a[left]a[loc]在内存中不是有效位置。您可能需要添加某种代码以确保leftloc保持在数组的范围内。

如果您迫切需要知道导致程序崩溃的原因,自己运行此过程将比要求其他人为您执行此过程快得多。这个过程非常简单,因此很少有人会愿意为您运行它。我只是作为一个例子,因为我意识到你第一次开始编程时并不明显。

注意:我使用命令行程序来检查它,因为它很快,但您可能更习惯在IDE中使用调试器。如果您运行Eclipse,您应该只需单击“调试”按钮(通常是绿色错误),它将告诉您这些确切的信息。