前言
有一段时间,当需要对数组进行排序的时候,就不得不自己编写一个冒泡或者选择排序法,费时费力不说,排序效率也不高。
其实,C语言为我们提供了一个实现了快速排序的函数qsort,对于较大型数组而言,“快速排序算法”是最有效的排序算法之一。
函数原型及说明
1 2 3 4 5 6 7
| 函数原型: void qsort(void * base, size_t nmemb,size_t size ,int(*compar)(const void *,const void *))
参数说明: 第1个参数是指针,指向待排序数组的首元素(可以引用任意类型的数组) 第2个参数是待排序项的数量。(size_t 是sizeof运算符返回的整数类型) 第3个参数是待排序数组中,每个元素的大小(所占字节数) 第4个参数是一个函数指针,这个被指针指向的函数用与确定排序的顺序,该函数返回int型且接受两个指向const void的指针作为参数,这两个指针指向待比较项
|
实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| /* 用qsort排序一组数据 */
void fillList(double* list,int n); void showList(double* list,int n); int mycompare(const void * p1,const void * p2); int main(){ double list[NUM]; fillList(list,NUM); printf("排序前: \n"); showList(list,NUM); printf("排序后:\n"); qsort(list,NUM,sizeof(double),mycompare); showList(list,NUM); } void fillList(double* list,int n){ //用随机数填充数组 for(int i=0;i<n;i++){ list[i]=(double) rand()/((double) rand()+0.1); } } void showList(double* list,int n){ //打印数组 for (int i=0;i<n;i++){ printf("%9.4f",list[i]); if(i%6==5) printf("\n"); } printf("\n\n"); } int mycompare(const void * p1,const void * p2){ //需要自己编写的排序函数 作用是将数组按照升序排序 double* a1=(double*) p1; double* a2=(double*) p2; //将传入的void指针通过强制类型转换成待排序的数组的类型 if(*a1>*a2) return 1; else if(*a1<*a2) return -1; else return 0;// 相等返回 0 } //int mycompare(const void * p1,const void * p2){//作用是将数组按降序排序 // double* a1=(double*) p1; // double* a2=(double*) p2; //将传入的void指针通过强制类型转换成待排序的数组的类型 // // if(*a1>*a2) return -1; // else if(*a1<*a2) return 1; // else return 0;// 相等返回 0 //}
|
运行效果图
最后说明
用于比较的函数需要自己编写,并需要能让qsort函数根据返回值进行排序。。
一般根据升序或降序的需要 根据大小关系返回 1 -1 0