2013-06-19 72 views
0

我寫了下面的快速排序算法的實現。我無法猜測爲什麼下面的代碼片段不工作(編譯良好但無法在運行時運行時a.exe已停止工作) 。我會很高興,如果有人對你能幫助我在這方面:a.exe已停止工作快速排序程序

main() 
{ 
    int a[ ]={9,2,3,1,6,5,6,3,2,9,8,1,4,5,5,6,5,99}; 
    quicksort(a,0,17); 
    print(a,18);  

}

void print(int a[ ],int n) 
{ 
int i; 
for (i=0;i<n;i++) 
     printf("%d\n",a[i]); 
} 

    void swap(int a[ ],int left,int right) 
     { 
     int t; 
     t=a[left]; 
      a[left]=a[right]; 
      a[right]=t; 
    } 

    void quicksort(int a[ ],int left,int right) 
    { 
    int i,last; 
     if (left >= right) 
      return; 
    swap(a,left,(last+right)/2); 
     last=left; 
     for (i=last+1;i<=right;i++) 
      if (a[i] < a[left]) 
       swap(a,++last,i); 
     swap(a,left,last); 
     quicksort(a,left,last-1); 
     quicksort(a,last+1,right); 

}

+0

究竟是做什麼或不做這個問題? –

+2

使用調試器.... –

+0

關於你的方法,我建議你有一個單獨的分區功能,你可以在你的'quicksort'函數中調用。 – Nobilis

回答

0

問題就在這裏:

void quicksort(int a[ ],int left,int right) 
{ 
    int i,last; 
    if (left >= right) 
     return; 
    swap(a,left,(last+right)/2); 
       ^^^^ 

last未初始化,但您正在使用它作爲right的補充。

Did you mean (left+right)/2

我的編譯器不僅警告我(總是啓用警告),但我進一步使用調試器仔細檢查確實如此。

的編譯器警告:

23:22: warning: ‘last’ may be used uninitialized in this function [-Wuninitialized]

的調試器輸出:

Breakpoint 2, main() at quicksortbroken.c:37 
37  int a[ ]={9,2,3,1,6,5,6,3,2,9,8,1,4,5,5,6,5,99}; 
(gdb) n // go to the next line 
38  quicksort(a, 0, 17); 
(gdb) s // step into the function 
quicksort (a=0xbffff6d8, left=0, right=17) at quicksortbroken.c:21 
21  if (left >= right) 
(gdb) n 
23  swap(a,left,(last+right)/2); // okay, let's examine the variable I suspect is problematic 
(gdb) p last // print the value of last 
$1 = 1872329 // Oh, oh, definitely not supposed to be this value 

這是在Linux下使用GDB,不知道你是如何編譯你的代碼,但我敢肯定的Cygwin帶有GDB的Windows端口,微軟也有自己的調試器。沒有藉口不使用一個。

0

也許你缺少像 ‘last’ may be used uninitialized in this function

首先使用last沒有它的初始化是創建分段故障,從而期待您的exe文件不工作的警告。

0

這段代碼有兩個問題。 一個是一般的編碼規則,每個變量都應該用一個值初始化,否則它可能會發生垃圾值並給出意外的輸出。第二個問題在你的算法中。在調用swap函數的函數quicksort中,要傳遞的正確參數是「swap(a,left,(left + right)/ 2);」

P.S. - 如果在一個項目上工作,也會提供函數原型,否則將忽略它。