2015-09-01 69 views
-1

我正在嘗試實現快速排序的隨機化版本。我已經成功地使用了正常版本的quicksort,但現在g ++編譯器說浮點異常(core dumped)。我如何繼續?關於隨機化快速排序執行的運行時錯誤

#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; 
} 
+1

'我該如何繼續'用調試器。找到導致浮點異常的行並檢查導致錯誤的值。 –

+2

你是否確定這個表達式的右邊'int i = start + rand()%(start + end-1);'從來不是'0'? –

+0

它只是我,或者這既不是C也不是C++? I/O流是*絕對*不是c,並且可變長度數組不會看C++給我。 – EOF

回答

2

但現在的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) 

所以問題是在part功能。 最明顯的嫌疑人是​​正如在評論中指出的,如果除數是0你會崩潰。它取決於你想出來。