#include
#include
#define MAX 10
int rintv(double value);
void noduplex_rand(int n,int *a);
int random(int max,unsigned long* idum);
void display(int* a, int n);
void quick_sort(int* a, int n);
int main()
{
int a[MAX];
noduplex_rand(MAX,a);
printf("**before quick sort\n");
display(a, MAX);
quick_sort(a, MAX);
printf("**after quick sort\n");
display(a, MAX);
return 0;
}
int rintv(double value)
{
if(value > 0) return (int)(value + 0.5);
else return (int)(value - 0.5);
}
int random(int max,unsigned long* idum)
{
*idum=(*idum)*1103515245 + 12345;
return rintv(max * ((double)(*idum/65536 % 32768) / (double)32767));
}
void noduplex_rand(int n,int *a)
{
unsigned long idum;
int i,rn,val;
int *rand_tbl=(int*)calloc(n,sizeof(int));
int *hist=(int*)calloc(n,sizeof(int));
idum = time(NULL);
for(i=0;i<n;i++) rand_tbl[i] = i;
memset(hist,0,sizeof(int)*n);
rn = n-1;
while(rn!=-1){
val = random(rn,&idum);
hist[rand_tbl[val]]++;
a[n-rn-1] = rand_tbl[val];
for(i=val;i<rn;i++) rand_tbl[i] = rand_tbl[i+1];
rn --;
}
free(rand_tbl);
free(hist);
}
void display(int* a, int n)
{
int k;
printf(" ");
for(k=0;k<n;k++) printf("%d ", a[k]);
printf("\n");
}
void quick_sort(int* a, int n)
{
int i,j,b;
if(n<=1) return;
b = a[(n-1) >> 1];
i = 0;
j = n - 1;
while(i<=j) {
while(a[i]< b) i++;
while(a[j]> b) j--;
if(i<=j){
int w = a[i];
a[i++] = a[j];
a[j--] = w;
}
}
quick_sort(a,i);
quick_sort(a+i,n-i);
}
|