这篇之前发过了,介于许多小伙伴反馈的排版问题,现已将此排版重发了
一、 qsort 函数介绍
qsort是库函数要引头文件#include<stdlib.h>
参数形式: qsort(arr,sz,sizeof(arr[0]),my_cmp);
二、qsort的四个参数解读
第一个参数:是起始位置(一般用数组名)
第二个参数:是数组有多少个元素,一般用int=sz=sizeof(arr)/sizeof(sizeof(arr[0]);sizeof(数组
名)求出数组的大小,单位是字节,sizeof(arr[0])这是求出第一个的大小,事实上求数组中的哪一个元素都可以,因为数组是一类相同类型的集合。所以他们相除算出的是数组元素个数。
第三个参数:是数组每个元素的大小,也可以用sizeof(数组的类型)来计算。
第四个参数:是函数的排列比较,就是写一个比较函数。这个函数的形式是
int(const void* a,const void* b);
其中void*他是不确定类型的指类型的指针,可以接受任意类型变量的地址,
如int a=10;void* p=&a;char b='w';void* pa=&b;但是对于void类型的指针,因为他不确定类型,所
以对他进行++ --都是错误的操作,比如上述p++、pa++,P--等都是err写法,因为类型不确定导致程序不知道向前或向后访问几个字节(int向后访问4字节,char向后访问1字节)。
三、qsort函数具体例子:
#include<stdlib.h> #include<stdio.h> int int_cmp(const void* a,const void* b) //函数实现* { return *(int *)a-(int*)b; }//升序 //其中(int),为将void强制转化(int) //return (int*)b-(int)a;//降序 int main( ) //整形排序 { int arr[]={1,3,4,5,6,9,7,8,0,2}; int sz=sizeof(arr)/sizeof(arr[0]); qsort(arr,sz,sizeof(int),int_cmp); int i=0; for(i=0;i<sz;i++) { printf("%d ",*(arr+i));//打印每一个元素*(arr+i)等价于arr[i] } return 0; }
排浮点数的例子
#include<stdlib.h> #include<stdio.h> int float_cmp(const void* a, const void* b) //函数实现* { return(int)((float*)a -(float*)b); }//升序 //其中(int),为将void强制转化(int) //return(int) ((float*)b-(float*)a);//降序 int main() //float排序 { float arr[] = { 1.0, 3.0, 4.0, 5.0, 6.0, 9.0, 7.0, 8.0, 0.0, 2.0 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(float), float_cmp); int i = 0; for (i = 0; i<sz; i++) { printf("%f ", *(arr + i));//打印每一个元素*(arr+i)等价于arr[i] } return 0; }