//比较大小
static int compare_int(const void *int1,const void *int2)
{
if(*(const int*)int1>*(const int*)int2)
{
return 1;
}
else if(*(const int*)int1<*(const int*)int2)
{
return -1;
}
else
{
return 0;
}
}
//随机生成三个数,找出中间数的直接插入排序
int issort(void *data, int size,int esize,int (*compare)(const void *key1,const void *key2))
{
char *a = (char*)data;
void *key=NULL;
int i=0,j=0;
if((key=(char *)malloc(esize))==NULL)
{
return -1;
}
else
{
memset(key, 0, esize);
for(j=1;j<size;j++)
{
memcpy(key, &a[j*esize],esize);
i=j-1;
while(i>=0&&compare(&a[i*esize],key)>0){
memcpy(&a[(i+1)*esize],&a[i*esize],esize);
i--;
cout<<i<<endl;
}
memcpy(&a[(i+1)*esize],key,esize);
}
free(key);
return 0;
}
}
//与当前pval相比,小的放左边,大的放右边,pval即r[1]
static int partition(void *data, int esize, int i, int k, int (*compare)(const void *key1,const void *key2))
{
//cout<<"enter partition"<<endl;
char *a=(char*)data;
void *pval=NULL, *temp=NULL;
int r[3]={0,0,0};
//allocate storage for the partition value and swap
if((pval = malloc(esize))==NULL)
{
return -1;
}
if((temp = malloc(esize))==NULL)
{
free(pval);
return -1;
}
//Use the median-of-tree method to find the partition value
r[0] = (rand() % (k-i+1))+i;
r[1] = (rand() % (k-i+1))+i;
r[2] = (rand() % (k-i+1))+i;
issort(r, 3, sizeof(int), compare_int);
memcpy(pval, &a[r[1]*esize],esize);
//cout<<"*pval= "<<(pval)<<endl;
//create two partitions around the partition value
i--;
k++;
// cout<<"this is i: "<<i<<endl;
// cout<<"this is k: "<<k<<endl;
while(1)
{
do{
// cout<<"doing k"<<endl;
k--;
}while(compare(&a[k*esize],pval)>0);
do{
// cout<<"doing i"<<endl;
i++;
}while(compare(&a[i*esize],pval)<0);
if(i >= k)
{
// cout<<"doing break"<<endl;
break;
}
else
{
// cout<<"swaping......................."<<endl;
memcpy(temp, &a[i*esize], esize);
memcpy(&a[i*esize], &a[k*esize], esize);
memcpy(&a[k*esize], temp, esize);
}
}
free(pval);
free(temp);
// cout<<"left partition"<<endl;
return k;
}
//排序调用
int qksort(void *data, int size, int esize, int i, int k, int (*compare)(const void *key1,const void *key2))
{
int j;
while(i<k)
{
if((j=partition(data,esize,i,k,compare))<0)
{
//cout<<"return partition"<<endl;
return -1;
}
if(qksort(data,size,esize,i,j,compare)<0)
{
//cout<<"return qksort"<<endl;
return -1;
}
else
{
i=j+1;
//cout<<"i value: "<<i<<endl;
//cout<<"j value: "<<j<<endl;
}
}
return 0;
}