学会qsort()函数,就是如此简单,快来看看吧
Posted ITWEL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学会qsort()函数,就是如此简单,快来看看吧相关的知识,希望对你有一定的参考价值。
(一)参数详解
void qsort(
void *base;
size_t nmemb;
size_t size;
int(*copmar)(const void*,const void*)
)
(1)函数存在位置:<stdlib.h>(使用该函数别忘了引入该头文件)
(2)函数功能:qsort()函数的功能是对数组进行排序,数组有nmemb个元 素,每个元素大小为size。
(3)具体参数分析:
参数base : base指向数组的起始地址,该位置传入的是一个数组名。
参数nmemb :nmemb表示该数组的元素个数
参数size :size表示该数组中每个元素的大小(字节数)
参数(*compare)(const void *, const void *):此为指向比较函数的函数指 针,决定了排序的顺序。
int compare(const void *elem1, const void *elem2);
注意:如果两个元素的值是相同的,那么它们的前后顺序是不确定的。也就是说qsort()是一个不稳定的排序算法
(二)函数原型
/*qsort排序函数使用普通的选择排序*/
void qsort(const void *_tmp,const int number,unsigned width,int(*compare)(void *,void *))
int i,j,small;
for(i=0;i<number-1;i++)
small=i;
for(j=i+1;j<number;j++)
if(compare((((char *)_tmp)+j*width),(((char *)_tmp)+small*width)))//if(_tmp+j<_tmp_small) return TURE;
small=j;
if(small!=i)
swap((((char *)_tmp)+i*width),(((char *)_tmp)+small*width),width);
void qsort(const void *,const int number,unsigned width,int(*compare)(void *,void *),void (*swap)(void *,void *));
具体解释如下:如果已知指向两块内存空间的指针和每块空间的大小,我们便可以实现两块空间的交换(通过指针或使用swap()函数)
也可以用swap()来实现:
static void swap(char *tmp_a, char *tmp_b,unsigned width)
char temp;
if(tmp_a!=tmp_b)
while(width--)
temp = *tmp_a;
*tmp_a++ = *tmp_b;
*tmp_b++ = temp;
在qsort()函数中我们可以得到指针和每块空间的大小,因此,就不用使用
swap()这个参数了
函数声明变为:
void qsort(const void *,const int number,unsigned width,int(*compare)(void *,void *));
(三).使用指导
int compare(const void *elem1, const void *elem2);
void*a:表示是的是任意类型的指针(常量指针)
const :修饰常量
常量指针: const * a 或 const void * a 指的是 这个指针的对象必须是个 常量, 带void 的意思是 不指定a的类型
I.用法1
(1)使用规则
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面
(2)方法1演示(升序)
//实现数组元素的升序排列
int compareMyType (const void * a, const void * b)
if ( *(MyType*)a < *(MyType*)b ) return -1;
if ( *(MyType*)a == *(MyType*)b ) return 0;
if ( *(MyType*)a > *(MyType*)b ) return 1;
//MyType为具体使用类型
(3)方法2演示(升、降序)
//升序
int compar(const void*a,const void *b)
return *(tpye*)a-*(type*)b;
//降序
int compar(const void*a,const void *b)
return *(tpye*)b-*(type*)a;
注意:存在弊端,如果a为j较小负数,b为一个较大正数,差值会为正数(使用减法可能会产生溢出),根据规则,会交换,如果交换便会出现错误(a<b),所以方法1更为合适
(4)代码演示
//引用头文件
int compare(const void*a,const void*b)
return ( *(int*)a - *(int*)b );
void qsort(int *模拟实现qsort atoi函数,小白快来看