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;
}
你確定這就是問題所在? [對我來說似乎很好](http://coliru.stacked-crooked.com/a/35084bd05c33eec5)。也許這個問題存在於算法的其他地方。 – 2014-01-31 05:08:10
像許多這樣的黑客,如果兩個變量相同,則交換失敗。使用簡單的代碼幾乎總是更好。 – rici
只需通俗一點,讓編譯器優化它。 – ooga