C语言 qsort函数详解

前言

有一段时间,当需要对数组进行排序的时候,就不得不自己编写一个冒泡或者选择排序法,费时费力不说,排序效率也不高。
其实,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排序一组数据 */ 
#include<stdio.h>
#include<stdlib.h>

#define NUM 40 //定义数组长度
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