c语言学习笔记——qsort函数

本文介绍了C库中的qsort函数,用于快速排序。详细解析了函数参数,包括base指针、nitems元素数量、size元素大小以及compar比较函数。通过示例展示了如何编写compar函数实现不同数据类型的排序,如int和char数组,并提醒在处理浮点数时要注意精度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 对数组进行排序。qsort函数所用的排序方式是快速排序,是一种不稳定的排序方式。

参数

  • base -- 指向要排序的数组的第一个元素的指针。
  • nitems -- base 指向的数组中元素的个数。
  • size -- 数组中每个元素的大小,以字节为单位。
  • compar -- 用来比较两个元素的函数。
int* compar(const void* a, const void* b)     
{
    return(*(int*)a - *(int*)b);
}

如果compar返回值小于0,那么a所指向元素会被排在b所指向元素的前面;如果compar返回值等于0= 0),那么a所指向元素与b所指向元素的顺序不确定;如果compar返回值大于0,那么a所指向元素会被排在b所指向元素的后面;

因此,如果想让qsort()进行从小到大(升序)排序,那么一个通用的compar函数可以写成这样:

int* compar(const void* a, const void* b)     
{
    return(*(int*)b - *(int*)a);
}

此外,通过强制转换compar输入指针参数的类型(输入一般默认为void* 型指针,上例中强制将其转换成int型),可以实现对多种数据类型数组的排序,如利用下面的比较函数compar可实现对字符数组的排序:

int* compar(const void* a, const void* b)     
{
    return(*(char*)b - *(char*)a);
}

对double型数组排序:

int* compar(const void* a, const void* b)     
{
    return *(double*)b > *(double*)a ? 1:-1;
}

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系。

返回值:

该函数会修改输入数组,但不会返回任何值。

 

举例1:对int型数组排序

#include <stdio.h>
#include <stdlib.h>

int values[] = { 88, 56, 100, 2, 25 };
int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main()
{
   int n;
   qsort(values, 5, sizeof(int), cmpfunc);
   printf("\n排序之后的列表:\n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }
  return(0);
}

 

举例2:对char型数组进行排序

int* cmp(const void* a, const void* b)
{
    return(*(char*)a - *(char*)b);
}

int main() {  
    char a[] = "helloworld";
    qsort(a, strlen(a), sizeof(char), cmp);
    for (int i = 0; i < strlen(a); i++) {
        printf("%c ", a[i]);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值