qsort函数——快速排序

简介: 本篇讲qsort函数的使用和如何模拟实现qsort函数

前言

本篇讲qsort函数的使用和如何模拟实现qsort函数

一、函数头文件

#include<stdlib.h>

二、函数声明

void qsort(void* base, //指向了需要排序的数组的第一个元素
           size_t num, //排序的元素个数
           size_t size,//一个元素的大小,单位是字节
           int (*cmp)(const void*, const void*)//函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素
          );

三、 参数

  • base -- 指向要排序的数组的第一个元素的指针。
  • num -- 由 base 指向的数组中元素的个数。
  • size -- 数组中每个元素的大小,以字节为单位。
  • cmp -- 函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素

四、返回值

该函数不返回任何值。

五、cmp不同类型排序

1、int类型

升序排列
int cmp(const void *a,const void *b) {
  return *(int*)a-*(int*)b;
}
//降序排列 
//return *(int*)b-*(int*)a;

2.double类型

升序排列
int cmp(const void *a,const void *b) {
  return *(double*)a-*(double*)b;
}
//降序排列 
//return *(double*)b-*(double*)a;

3.char类型

升序排列
int cmp(const void *a,const void *b) {
  return *(char*)a-*(char*)b;
}
//降序排列 
//return *(char*)b-*(char*)a;

4、结构体类型

struct Stu
{
  char name[20];
  int age;
};
int cmp_struct_age(const void* p1, const void* p2)
{
  return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

六、使用展示

#include<stdio.h>
#include<stdlib.h>
//int类型
int int_cmp(const void* p1, const void* p2)
{
  return(*(int*)p1 - *(int*)p2);
}
int test1()
{
  int arr[] = { 1,3,5,7,9,2,4,6,8,0 };
  qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
}
//结构体类型
struct Stu
{
  char name[20];
  int age;
};
int cmp_struct_age(const void* p1, const void* p2)
{
  return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
void test2()
{
  struct Stu arr[] = { {"zhangsan",20},{"lisi",50},{"wangwu",15}};
  qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_age);
}
int main()
{
  test1();
  test2();
  return 0;
}

七、模拟实现qsort函数

#include<stdio.h>
int int_cmp(const void* p1, const void* p2)
{
  return (*(int*)p1 - *(int*)p2);
}
void swap(void* p1, void* p2, int size)
{
  int i = 0;
  for (i = 0; i < size; i++)
  {
    char tmp = *((char*)p1 + i);
    *((char*)p1 + i) = *((char*)p2 + i);
    *((char*)p2 + i) = tmp;
  }
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
  int i = 0;
  for (i = 0; i < count - 1; i++)
  {
    int j = 0;
    for (j = 0; j < count - 1 - i; j++)
    {
      if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
      {
        swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
      }
    }
  }
}
int main()
{
  int arr[] = { 25,35,68,79,21,13,98,7,16,62 };
  bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
  for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

行文至此,请放心食用,如有疑惑,欢迎评论区留言!

目录
相关文章
|
11月前
|
JavaScript 开发者 Windows
NVM 介绍及使用指南
NVM(Node Version Manager)是用于管理多个 Node.js 版本的命令行工具,帮助开发者在同一台机器上轻松切换不同版本的 Node.js,避免版本不兼容问题。本文介绍 NVM 的基本概念、Windows 安装方法及常用操作,助你高效管理 Node.js 版本。
1095 13
 NVM 介绍及使用指南
|
3天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1292 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1319 87
|
2天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
178 82
2025年阿里云域名备案流程(新手图文详细流程)