万能排序----快速排序


int campare(const void *a,const void *b)
{
 char *x=(char *)a;
 char *y=(char *)b;
// printf("*x-*y=%d\n",*x-*y);
 return *x-*y;

}
void swap(char *a,char *b,int size)
{
 char temp;
 if(*a!=*b)
 {
  while(size--)
  {
   temp=*a;
   *a++=*b;
   *b++=temp;
  
  }
 
 }


}

 


void quicksort(void *k, int start_num,int end_num,int size,int (*campar)(const void *,const void *))
{                            /*快速排序*/
    int i,j;

    if(start_num < end_num)//划分结束条件
 {
        i = start_num;
        j = end_num+1;
        while(1)
  {
            do
   {
    i++;
            }while( !(campar((char *)(k+start_num*size),(char *)(k+i*size))<=0 || i==end_num) ); 
  //campar((char *)(k+start_num*size),(char *)(k+i*size))<=0
    //从第一个开始求出第一个大于基准值的元素位置i
           
   do
   {
    j--;
   }while(!(campar((char *)(k+start_num*size),(char *)(k+j*size))>=0|| j==start_num)); 

//campar((char *)(k+start_num*size),(char *)(k+j*size))>=0   //从最后开始求出第一个小于基准值的元素位置j
          
   if(i    {
                swap(k+i*size,k+j*size,size);                /*交换k[i]和k[j]的位置*/
    //print(k);
   }
            else
                break;

        }
        swap(k+start_num*size,k+j*size,size);                  //将基准元素与从后往前的第一个大于s的元素进行交换,即放在中间
  quicksort(k,start_num,j-1,sizeof(int),campar);                     /*递归排序基准元素前面的子序列*/
  quicksort(k,j+1,end_num,sizeof(int),campar);                     /*递归排序基准元素后面的子序列*/
    }
}
void quick_rank(void *number,int nnumber,int size,int (*campar)(const void *,const void *))
{
 
 quicksort(number, 0,nnumber-1,size,campar);


}

你可能感兴趣的:(工具包)