2014-01-31 52 views
1

我正在編寫快速排序的C代碼,但出錯了。經過一些調試後,我終於找到了我的代碼出錯的地方。 當我更換使用只有兩個變量不工作的交換

 { 
a[lp]+=a[ub]; 
a[ub]=a[lp]-a[ub]; 
a[lp]=a[lp]-a[ub]; 
} 

{ 
tmp=a[lp]; 
a[lp]=a[ub]; 
a[ub]=tmp; 
} 

我的代碼開始工作。 我很想知道爲什麼我的初始交換實施不起作用? 任何人都可以幫助我嗎?

#include<stdio.h> 
    #define swap(a,b) (a)=(a)+(b);b=(a)-(b);(a)=(a)-(b); 
    int a[]={7,1,5,2,3}; 
    int partition(int lb,int ub) 
    { 
    int k,hp,lp; 
    k=a[ub]; 
    lp=lb-1; 
    for(hp=lb;hp<ub;hp++) 
    { 
    if(a[hp]<k) 
    { 
    lp++; 
    int tmp=a[lp]; 
    a[lp]=a[hp]; 
    a[hp]=tmp; 
    } 
    } 
    lp++; 
    a[lp]+=a[ub]; 
    a[ub]=a[lp]-a[ub]; 
    a[lp]=a[lp]-a[ub]; 
    return lp; 
    } 
    void quicksort(int lb,int ub) 
    { 
    if(lb<ub) 
    { 
    int pos=partition(lb,ub); 
    quicksort(lb,pos-1); 
    quicksort(pos+1,ub); 
    } 
    } 
    int main() 
    { 
    quicksort(0,4); 
    int i; 
    for(i=0;i<5;i++)printf("%d ",a[i]); 
    printf("\n"); 
    return 0; 
    } 
+0

你確定這就是問題所在? [對我來說似乎很好](http://coliru.stacked-crooked.com/a/35084bd05c33eec5)。也許這個問題存在於算法的其他地方。 – 2014-01-31 05:08:10

+1

像許多這樣的黑客,如果兩個變量相同,則交換失敗。使用簡單的代碼幾乎總是更好。 – rici

+1

只需通俗一點,讓編譯器優化它。 – ooga

回答

3

你需要考慮當LP == UB(即你被要求以自己交換的元素)會發生什麼。

它改成這樣:

if (lp != ub) { 
    a[lp]+=a[ub]; 
    a[ub]=a[lp]-a[ub]; 
    a[lp]=a[lp]-a[ub]; 
} 

例子:http://ideone.com/AS1Dgf

+0

- 謝謝男人,得到它:) –

相關問題