学会qsort()函数,就是如此简单,快来看看吧

Posted ITWEL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学会qsort()函数,就是如此简单,快来看看吧相关的知识,希望对你有一定的参考价值。

学会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)代码演示
#include<stdio.h>
#include<stdlib.h> //引用头文件

int compare(const void*a,const void*b)

return ( *(int*)a - *(int*)b );

void qsort(int *模拟实现qsort atoi函数,小白快来看

学会小米9008高通模式_原来刷机如此简单

稳定标准库 qsort?

服装店商家不离手的十大服装进销存管理软件,快来看看吧

C语言中的文件操作你了解多少?快来看看吧[建议收藏]

macos安装失败一直重启 快来看看吧