一个关于快排的问题。
#include <stdio.h>#include <iostream>
#include <stdlib.h>
#include <time.h>
#define N 100
void qsort(int *a,int n);
void quick(int *a,int left,int right);
int main()
{
int arr[N],i;
srand(time(NULL));
for(i=0;i<N;i++)
arr[i]=rand()/100;
qsort(arr,N);
for(i=0;i<N;i++)
printf("%d ",arr[i]);
system("pause");
return 0;
}
void qsort(int *a,int n)
{
quick(a,0,n-1);
}
void quick(int *a,int left,int right)
{
int f,l,r,t,tem;
l=left;
r=right;
f=a[(left+right)/2]; /****????????????******/
while(l<=r)
{
while(a[l]<f) ++l;
while(a[r]>f) --r;
if(l<=r)
{
t=a[l];
a[l]=a[r];
a[r]=t;
++l;
--r;
}
}
if(left<r) quick(a,left,l-1);
if(l<right) quick(a,r+1,right);
}
上面这段程序中这段程序
f=a[(left+right)/2]; /****????????????******/
while(l<=r)
{
while(a[l]<f) ++l;
while(a[r]>f) --r;
如果换成
f=(left+right)/2;
while(l<=r)
{
while(a[l]<a[f]) ++l;
while(a[r]>a[f]) --r;
再次运行排出来就接近乱序,,,,,,而原来的排出来就是正确的。
这两段应该没什么区别啊。。。。
求解。。。。