菜鸟提问 c语言关于快速排序

来源:百度知道 编辑:UC知道 时间:2024/05/17 06:59:31
#include<stdio.h>
#include<stdlib.h>
void quicksort(int R[],int s,int t)
{
int i=s,j=t;
int temp;
if(s<t)
{
temp=R[s];
while(i!=j)
{
while(j>i && R[j]>temp)
j--;
while(i<j && R[i]<temp)
i++;
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
}
R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);
}
}
int main()
{
int i;
int a[]={5,3,2,1,9,8,7,4,5};
quicksort(a,0,sizeof(a)/sizeof(int)-1);
for(i=0;i<sizeof(a)/sizeof(int);i++)
printf("%d ",*(a+i));
system("pause");
}
当数组中有重复的数字时,就排不出来了,只有数组中数字都不一样时排出的结果才正确。哪位高手能帮忙修正一下。
如果能给出快速排序的非递归代码就太感谢了,我会再加分的。
由于小弟我刚接触C语言没多久,希望能解释的浅显点。十分感谢!!!!

其实,最想说明的是那段交换的代码
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
一定要排除 i==j 的情况。即自己与自己交换的情况。
如:
a=9;
a^=a;/*a=0*/
a^=a;/*a=0*/
a^=a;/*a=0*/
a就不再是10了。

#include<stdio.h>
#include<stdlib.h>
void quicksort(int R[],int s,int t)
{
int i,j;
int temp;
if(s<t)
{
temp=R[s];/*选第一个数作为参照*/
/*while(i!=j)不要用这种方法判定循环结束,万一i==j-1,i++,j--后 i〉j了,!=这个条件就救不了你了*/
for(i=s+1,j=t;i<=j;i++,j--)/*不包括参照数,进行左右阵营站队*/
{
while(j>i && R[j]>=temp)/*R[j]>=temp不要 = 也行,加了更好,毕竟相等的无论站左站右,哪边都无所谓*/
j--;
while(i<j && R[i]<=temp)
i++;
if(i!=j){/*i千万不能等于j*/
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
}
}
i--;
if(R[s]<R[i])i--;/*调整i的值,使i指向最后一个小于等于参照数的位置*/
/*将参照数 与 最后一个小于等于参照数的数进行交换,这样就真正把左右两个阵营分开了*/
R[s]=R[i];
R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);
}
}
int main(void)
{
int i;