快速排序库函数qsort解析

void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
base是待排序数组的起始地址,
nelem是待排序数组的元素个数,
width是待排序数组的每个元素的大小(以字节为单位),最后一个参数
pfCompare是一个函数指针,它指向一个“比较函数”。

排序就是一个不断比较并交换位置的过程。
qsort如何在连元素的类型是什么都不知道的情况下,比较两个元素并判断哪个应该在前呢?
答案是,qsort函数在执行期间,会通过pfCompare指针调用一个“比较函数”,用以判断两个元素哪个更应该排在前面。
这个“比较函数”不是C/C++的库函数,而是由使用qsort的程序员编写的。
在调用qsort时,将“比较函数”的名字作为实参传递给pfCompare。程序员当然清楚该按什么规则决定哪个元素应该在前,哪个元素应该在后,这个规则就体 现在“比较函数”中。

qsort函数的用法规定,“比较函数”的原型应是: int 函数名(const void * elem1, const void * elem2);
该函数的两个参数,elem1和elem2,指向待比较的两个元素。也就是说,* elem1和* elem2 就是待比较的两个元素。该函数必须具有以下行为:
1) 如果* elem1应该排在* elem2前面,则函数返回值是负整数(任何负整数都行)。
2) 如果* elem1和* elem2哪个排在前面都行,那么函数返回0
3) 如果* elem1应该排在* elem2后面,则函数返回值是正整数(任何正整数都行)

下面的程序,功能是调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序。比如8,23,15三个数,按个位数从小到大排序,就应该是23,15,8.

#include
#include
int MyCompare(const void * elem1, const void * elem2 )
{
unsigned int * p1, * p2;
p1 = (unsigned int *) elem1;
p2 = (unsigned int *) elem2;
return (* p1 % 10) - (* p2 % 10 );
}
#define NUM 5
int main()
{
unsigned int an[NUM] = { 8,123,11,10,4 };
qsort(an, NUM, sizeof(unsigned int),
MyCompare);
for(int i = 0;i < NUM; i ++ )
printf("%d ", an[i]);
return 0;
}
上面程序的输出结果是:
10 11 123 4 8
posted @ 2013-05-18 10:04  dreamsyeah  阅读(396)  评论(0编辑  收藏  举报