仅使用两个不起作用的变量进行交换

时间:2014-01-31 04:59:23

标签: c quicksort

我正在编写一个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;
    }

1 个答案:

答案 0 :(得分: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