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;
}

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

目录
相关文章
|
10月前
|
JavaScript 开发者 Windows
NVM 介绍及使用指南
NVM(Node Version Manager)是用于管理多个 Node.js 版本的命令行工具,帮助开发者在同一台机器上轻松切换不同版本的 Node.js,避免版本不兼容问题。本文介绍 NVM 的基本概念、Windows 安装方法及常用操作,助你高效管理 Node.js 版本。
1072 13
 NVM 介绍及使用指南
|
22小时前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1050 0
|
9天前
|
人工智能 运维 安全
|
22小时前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
238 0
|
7天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
713 23