實現qsort函數原型

快速排序,作爲能唯一能存在於庫函數裏的排序算法,qsort()的優勢就在於非常靈活.

用man qsort 查看其文檔


void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));


發現它的優勢就提現在他的參數用 使用了 void *  和函數指針.

參數: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的佔用空間大小
4 指向函數的指針,用於確定排序的順序

那麼接下來怎麼自己實現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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章