qsort详解

最近在研究快速排序,发现C语言标准库中有一个快速排序的函数qsort。

原型:

#include 

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

描述:

  • qsort函数的作用是将包含有nmemb个size大小的元素的数组进行排序。
  • 参数base就是数组的起始地址。
  • 参数nmemb是指数组中元素的个数。
  • 参数size是值数组中元素的大小。
  • 排序的顺序是有函数指针compar来指定的。compar所指定的函数中,如果要升序排序的话,第一参数大于第二参数返回大于0的值,第一个参数小于第二个参数返回小于0的值。如果要降序排序的话,就反过来,第一参数大于第二参数返回小于0的值,第一个参数小于第二个参数返回大于0的值。

注意:

  • 如果两个元素相等,那么他们在排序后的数组中的位置是不确定的。
  • 在cmp中函数中,尽量不要用减法,因为有可能会溢出,最好用比较运算。

=====================================================================================================

一些比较典型的compare函数:

  • int型数组
int arr[100];
int cmp(const void *a, const void *b)
{
    return *(int *)a > *(int *)b ? 1 : -1;
}
qsort(arr, 100, sizeof(arr[0]), cmp);
  • double型数组
double arr[100];
int cmp( const void *a ,  const void *b )
{
    return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(arr,100,sizeof(arr[0]),cmp);

  • 字符数组(字符串)
char str[100];
int cmp(const void *a, const void *b)
{
    return strcmp(*(char *)a, *(char *)b);
}
qsort(str, 100, sizeof(str[0]), cmp);
  • 结构体的排序
struct _Date
{
    double data;
    int other;
}a[100];
typedef struct _Date Date;
//按照data的值从小到大将结构体排序
int cmp( const void *a ,const void *b)
{
    return (*(Date *)a).data > (*(Date *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);

你可能感兴趣的:(数据结构与算法,C语言,qsort)