C++_快速排序(纯C版本)

来源:互联网 发布:爱拍录屏软件 编辑:程序博客网 时间:2024/05/18 10:10

//比较大小

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 swapif((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 valuer[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 valuei--;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;}