c语言函数qsort()总结

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)

猜你喜欢

转载自blog.csdn.net/qonsnow/article/details/50620023