系统提供的qsort排序的用法
该函数其实是一个快排,具体声明如下:
void qsort(void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *p, const void *q));
各参数的意义:
base
:待排序的对象,比如一个数组;
nmemb
:待排序的对象中元素的个数,比如一个数组中的元素个数;
size
:待排序对象中的元素所占内存大小;
compar
:自定义的比较函数,专业一点其实就是一个函数指针,一个返回值为int,传入参数为void型的两个待排数的函数。
我们再来详细讲一下compar
这个函数,它的返回值为int
,当为正数的时候,就认为交换条件成立,传入的两个参数p,q指向的数将会交换位置,否则不进行交换。
具体我们来看代码分析一下:
#include <stdio.h>
#include <stdlib.h>
void print_array(int arr[],int n){
// 打印数组
int* p = arr;
while(p<arr+n){
printf("%d",*p++);
}
printf("\n");
}
int cmp(const void* p,const void* q){
// 自定义比较函数,也就是传入qsort的compar
int *pn = (int*)p;
int *pm = (int*)q;
// 进行类型转化;
// 由于我们给一个数组中的数排序,所以转化为int*型就可以;
int n = *pn; // 传入的第一个参数指向的数
int m = *pm; // 传入的第二各参数指向的数
if(m == n){
return 0; //两个数相等则维持原来的顺序
}else if(n > m){
return 1;//第一个数大于第二个数就进行交换
}else{
return -1;//第一个数小于第二个数就维持原来的顺序
}
// 该函数其实就是将两个数调整为自小到大的顺序
}
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
print_array(a,n);
qsort(a,n,sizeof(int),cmp);
print_array(a,n);
}
代码运行结果如下: