qsort函数的应用

简介: qsort函数的应用

C语言中对数据进行排序,但数据类型有很多种,比如整形,字符型,浮点型,结构体型等等,


用冒泡排序只能对一种类型进行排序,很不方便,这就需要一个强大的函数了。


qsort可以对各种类型的数据进行排序,但要用合理的方法去用它


qsort的使用


void qsort (void* base, size_t num, size_t size,

           int (*compar)(const void*,const void*));



qsort需要四个参数,前三个很好理解,第四个参数用来比较两个元素,返回的整形。

qsort 的使用


代码示例:

//比较两个数的大小
int int_cmp(const void* p1, const void* p2)
{
  return *(int*)p1 - *(int*)p2;
}
//打印数组
void print(int* arr,int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *(arr + i));
  }
  printf("\n"); 
 
}
 
#include<stdio.h>
int main()
{
  int arr[10] = { 2,4,1,4,8,6,5,9,7,5 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int width = sizeof(int);
  printf("排序前:");
  print(arr, sz);
 
  qsort(arr, sz, width, int_cmp);
 
  printf("排序后:");
 
  print(arr,sz);
 
  return 0;
}


用冒泡排序模拟qsort 的实现




因为qsort可以排列不同类型的数据,所以int_comp函数里要用void*指针来接收




进行交换,注意要转化成char类型!

最后浅浅打印一下



完整代码:

#include<stdio.h>
 
int int_comp(const void* p1, const void* p2)
{
  return *((int*)p1) - *((int*)p2);
}
 
 
void swap(void* e1, void* e2, int width)
{
  int i = 0;
  for (i = 0; i < width; i ++ )
  {
    char tem = *((char*)e1 + i);
    *((char*)e1 + i) = *((char*)e2 + i);
    *((char*)e2 + i) =  tem;
 
  }
}
void _qsort(void* arr, int sz, int width, int(*comp)(void* p1, void* p2))
{
  int i = 0;
  for (i = 0; i < sz - 1; i++)
  {
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (comp((char*)arr+j*width, (char*)arr + (j+1) * width) > 0)
      {
        swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width);
      }
    }
  }
}
 
 
void print(int arr[],int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
}
 
int main()
{
  //qsort的模拟
  //排列整型
  int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int width = sizeof(int);
 
  print(arr, sz);
 
  _qsort(arr, sz, width, int_comp);
 
  print(arr, sz);
 
  return 0;
}


这个模拟qsort函数也是很强大的,这里只排序了整形,还可以排序字符型,结构体等等。

这是我对qsort函数的一些理解。

相关文章
|
SQL 关系型数据库 MySQL
TiDB支持的SQL语法概述
【2月更文挑战第28天】本章将对TiDB所支持的SQL语法进行概述,涵盖其主要的语法特性和功能。我们将从基本的SQL语句到更复杂的查询和操作,逐步介绍TiDB的SQL语法,帮助读者更好地理解和使用TiDB进行数据库操作。
1113 0
|
JavaScript
vue element plus DateTimePicker 日期时间选择器
vue element plus DateTimePicker 日期时间选择器
513 0
|
9月前
|
JSON 监控 API
使用Zabbix API
使用Zabbix API
566 67
|
10月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
277 2
Spring Aop该如何使用
|
6月前
|
机器学习/深度学习 存储 算法
量子算法的设计与优化:迈向量子计算的未来
量子算法的设计与优化:迈向量子计算的未来
203 3
|
Kubernetes Cloud Native Docker
云原生技术:容器化与微服务架构的融合之道
【9月更文挑战第4天】在数字化时代的浪潮下,企业追求敏捷、高效、可扩展的IT架构成为共识。云原生技术作为现代软件部署的黄金标准,其核心理念在于推动应用的快速迭代与无缝迁移。本文将深入探讨云原生技术的精髓——容器化与微服务架构如何相互促进,共同构建起适应云计算环境的应用生态系统。我们将通过实际案例,揭示如何在云平台上利用这些技术实现服务的解耦、弹性伸缩及自动化管理,进而提升企业的竞争力。
196 4
|
SQL 存储 自然语言处理
数据库原理第三章课后题答案(第四版)
数据库原理第三章课后题答案(第四版)
427 0
|
11月前
|
监控 Java 测试技术
如何解读 jstat 工具输出的 G1 垃圾回收器性能数据?
如何解读 jstat 工具输出的 G1 垃圾回收器性能数据?
|
数据安全/隐私保护
服务器备份有哪些方法?
服务器备份有哪些方法?
855 2
|
关系型数据库 MySQL Unix
MySQL配置不区分大小写的方法
结论 通过适当配置 lower_case_table_names参数以及在数据定义和查询中选择合适的校对规则,可以灵活地控制MySQL中的大小写敏感性,以适应不同的应用场景和需求。这样的设置既可以增加数据库的兼容性,又可以在必要时利用大小写敏感性进行精确的数据处理。需要注意的是,修改 lower_case_table_names参数后,最好在数据库初始化时进行,以避免现有表名的大小写问题。
1288 3