2014-01-31 33 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

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

相关问题