快速排序,作爲能唯一能存在於庫函數裏的排序算法,qsort()的優勢就在於非常靈活.
用man qsort 查看其文檔
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
發現它的優勢就提現在他的參數用 使用了 void * 和函數指針.
那麼接下來怎麼自己實現qsort函數的實現呢 .
先看下快速排序的基本算法:
C語言版本:
voidQuickSort(int a[],int numsize)//a是整形數組,numsize是元素個數
{
int i=0,j=numsize-1;
int val=a[0];//指定參考值val大小
if(numsize>1)//確保數組長度至少爲2,否則無需排序
{
while(i<j)//循環結束條件
{
for(;j>i;j--)//從後向前搜索比val小的元素,找到後填到a[i]中並跳出循環
if(a[j]<val)
{
a[i]=a[j];
break;
}
for(;i<j;i++)//從前往後搜索比val大的元素,找到後填到a[j]中並跳出循環
if(a[i]>val)
{
a[j]=a[i];
break;
}
}
a[i]=val;//將保存在val中的數放到a[i]中
QuickSort(a,i);//遞歸,對前i個數排序
QuickSort(a+i+1,numsize-1-i);//對i+1到numsize這numsize-1-i個數排序
}
}
對之改造後:
static void my_swap (char *a, char *b, size_t width)
{
if ( a != b )
while ( width-- ) {
*a++ = *b++;
}
}
void my_qsort(void *base,size_t numsize, size_t size, int (*comper)(const void *a, const void *b))
{
int i=0,j=numsize-1;
char val[size];
my_swap(val,(char *)base,size);
if(numsize>1)
{
while(i<j)
{
for(;j>i;j--)
if(comper((char *)base+j*size,val) < 0)
{
my_swap((char *)base+i*size, (char *)base+j*size, size);
break;
}
for(;i<j;i++)
if(comper((char *)base+i*size,val) > 0)
{
my_swap((char *)base+j*size, (char *)base+i*size, size);
break;
}
}
my_swap(((char *)base+i*size),val,size);
my_qsort(base, i, size, comper);
my_qsort(((char *)base+(i+1)*size), numsize-1-i, size, comper);
}
}
注意 在調用函數時 comper所指向的對比函數是要自己實現的 ,例如下面int類型的對比函數:
int cmpint(const void *a, const void *b)
{
return *(const int*)a-*(const int*)b;
}