c语言函数qsort()总结
函数在头文件<stdlib.h>.用来快速排序.是一个不稳定的排序。
函数基本信息
函数原型,参数介绍
void qsort(void * base, int nelem , int width , int(*fcmp)(const void *, const void *));
-base带排序数组的首地址
-nelem数组中带排序元素的数量
-base个元素站用的空间大小
-base指向函数的指针(指向比较函数)
比较函数是用来提高qsort()通用性,因为通常参与排序的数组,很有可能是自定义类型例如我们要对自定义的结构体数组进行排序。
函数功能描述,代码展示
整形数组排序:
假设我们要 对int arry[10]排序。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int cmp(const void *a,const void * b){
return *(int *)a - *(int *)b;
}
int main(){
int arry[10] = {2,23,1,0,234,345,12,85,62,94};
qsort(arry,10,sizeof(int),cmp);
for(int i = 0;i<10;i++){
cout << arry[i] << " ";
}
}
我们对整形数组进行排序,前三个参数不过多解释,重点对第4个参数比较函数重点解释。我们认为cmp ()作用是给函数qsort()指明排序方向的。即从小到大,还是从大到小。
我们注意到比较函数cmp()返回值为整形,且有两个指针a,b,假设他们分别指向元素(a),(b);
比较函数cmp()是告诉qsort(),参与比较(a)(b)两个元素的大小。qsort()函数通过大小决定排序方向
- cmp()返回正数,告知qsort()函数(a)>(b)
- cmp()返回0,告知qsort()函数(a)=(b)
- cmp()返回负数,告知qsort()函数(a)<(b)
我犯过的错误
对double数组进行排序时,由于我忘记了,比较函数的返回值是整形,当时我的错误语句是
int cmp(const void *a,const void * b){
return *(double *)a - *(double *)b;
}
原因分析
由于返回值是整形,假设a指向的元素为2.0,b指向的元素为2.3,(double )a - (double )b这句话的得到的值是-0.3。但是函数的返回值是整形,qsort()收到值不是-0.3,而是0。因此qsort()认为(a)是等于(b)的。 从而造成了排序混乱。
修改
double in[100];
int cmp( const void *a , const void *b )
{ return *(double *)a > *(double *)b ? 1 : -1; }
qsort(in,100,sizeof(in[0]),cmp)