下面给出了我能想到的快速排序技术的代码。我不确定它是否正确,但根据我的逻辑,我猜它应该可以正常工作。但是,我认为我过分夸大了,因为当我尝试在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;
}
答案 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]
在内存中不是有效位置。您可能需要添加某种代码以确保left
和loc
保持在数组的范围内。
如果您迫切需要知道导致程序崩溃的原因,自己运行此过程将比要求其他人为您执行此过程快得多。这个过程非常简单,因此很少有人会愿意为您运行它。我只是作为一个例子,因为我意识到你第一次开始编程时并不明显。
注意:我使用命令行程序来检查它,因为它很快,但您可能更习惯在IDE中使用调试器。如果您运行Eclipse,您应该只需单击“调试”按钮(通常是绿色错误),它将告诉您这些确切的信息。