C++ 执行随机快速排序时出现运行时错误

C++ 执行随机快速排序时出现运行时错误,c++,c,arrays,c++11,quicksort,C++,C,Arrays,C++11,Quicksort,我正在尝试实现随机版本的快速排序。我已经成功地使用了quicksort的正常版本,但是现在g++编译器显示浮点异常(内核转储)。我该如何进行 #include<bits/stdc++.h> using namespace std; void qsort(int* a,int start,int end); int part(int*a,int start, int end); int main() { int i,n; cout<<"enter no

我正在尝试实现随机版本的快速排序。我已经成功地使用了quicksort的正常版本,但是现在g++编译器显示浮点异常(内核转储)。我该如何进行

#include<bits/stdc++.h>
using namespace std;
void qsort(int* a,int start,int end);

int part(int*a,int start, int end);

int main()
{
    int i,n;
    cout<<"enter no of elements...."<<endl;
    cin>>n;
    int a[n];
    cout<<"enter the elements to be sorted"<<endl;
    for(i=0;i<n;i++)
        cin>>a[i];
    int start=0;
    qsort(a,start,n-1);
    cout<<"the list is..";
    for(i=0;i<n;i++)
        cout<<a[i]<<' ';
    return 0;
}

void qsort(int* a,int start,int end)
{
    if(end>start)
    {
        int pi=part(a,start,end);
        qsort(a,start,pi-1);
        qsort(a,pi+1,end);
    }
}

int part(int*a,int start, int end)
{
    int pi,pivot,k;

    int i=start+rand()%(start+end-1);
    pi=start;       
    pivot=a[i];
    int j,t;

    for(j=start;j<end;j++)
    {
        if(a[j]<=pivot)
        {
            t=a[j];
            a[j]=a[pi];
            a[pi]=t;
            pi++;
        }
    }
    t=a[i];
    a[i]=a[pi];
    a[pi]=t;

    return pi;
}
#包括
使用名称空间std;
void qsort(int*a,int开始,int结束);
int部分(int*a,int开始,int结束);
int main()
{
inti,n;
库特
但是现在g++编译器说浮点异常(内核转储)

不,编译器没有说,实际的程序说了,因为它正在崩溃。您应该通过
gdb
或类似程序来运行它。如果您这样做,您将得到如下结果:

Program received signal SIGFPE, Arithmetic exception.
0x0000000000400bf2 in part(int*, int, int) ()
(gdb) bt
#0  0x0000000000400bf2 in part(int*, int, int) ()
#1  0x0000000000400b9c in qsort(int*, int, int) ()
#2  0x0000000000400bb6 in qsort(int*, int, int) ()
#3  0x0000000000400b0d in main ()
(gdb) 
所以问题出在
部分
函数中。
最明显的嫌疑犯是
int i=start+rand()%(start+end-1)
如注释中所指出的,如果除数为
0
,您将崩溃。这取决于您自己来解决。

如何使用调试器继续执行
。找到导致浮点异常的行并检查导致错误的值。您是否确保此表达式的右侧
int i=start+rand()< /COD> >绝对不是C或C++?I/O流绝对不是C,可变长度数组对我来说不太像C++。参见“代码>开始结束=1 < /代码>,然后在<代码> int=start +RAND()%(start +Endo-1)中。E/OFF:这是个问题。EOF:它不是标准C++,但是在GCC中,VLA是C++程序的允许扩展。