qsort函数和模拟实现qsort函数

简介: qsort函数和模拟实现qsort函数

🔥🔥🔥qsort函数

使用快速排序的思想来实现的一个排序函数

🌵qsort使用所需要的四个参数:

要排序的数据的起始地址

待排序的数据元素的个数

待排序的数据元素的大小,单位字节

函数指针——比较函数

int (*cmp)(const void* e1,const void* e2)

🌵🌵模拟演示qsort函数的使用:

🔺排序数字

#include <stdio.h>
#include <stdlib.h>
int int_cmp(const void* p1, const void* p2)
{
  return (*(int*)p1 - *(int*)p2);
}
int main()
{
  int arr[] = { 1,3,5,7,9,2,4,6,8,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  qsort(arr, sz, sizeof(arr[0]), int_cmp);
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
} 

🔸剖析代码:

函数:int_cmp的升降序

🔺排序结构体

#include <stdio.h>
#include <stdlib.h>
struct stu
{
  char name[20];
  int age;
};
int int_cmp_name(const void* e1, const void* e2)
{
  return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int int_cmp_age(const void* e1, const void* e2)
{
  return strcmp(((struct stu*)e1)->age, ((struct stu*)e2)->age);
}
int main()
{
  struct stu s[] = { {"zhang",15},{"li",30},{"wang",25} };
  int sz = sizeof(s) / sizeof(s[0]);
  qsort(s, sz, sizeof(s[0]), int_cmp_name);
  qsort(s, sz, sizeof(s[0]), int_cmp_age);
  return 0;
}

🔸特别注意:

例如:

int a=10;

char* pa=&a;报错

void* pb=&a;没问题

void*是无具体类型的指针,可以接收任意类型地址,不能解引用,不能+-整数

🔸比较大小

数字比较:30>25>15

字母比较: abcd > abbe;b>c


🔥🔥🔥模拟实现qsort函数

#include <stdio.h>
int int_cmp(const void* e1, const void* e2)
{
  return (*(int*)e1 - *(int*)e2);
}
void swap(char* e1, char* e2,int width)
{
  int i = 0;
  for (i = 0; i < width; i++)
  {
    char tmp = *e1;
    *e1 = *e2;
    *e2 = tmp;
    e1++;
    e2++;
  }
}
void bubble(void* base, int count, int width, int(*cmp)(void*, void*))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < count-1; i++)
  {
    int flag = 1;
    for (j = 0; j < count - 1 - i; j++)
    {
      if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
      {
        swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
        flag = 0;
      }
    }
    if (flag == 0)
      break;
  }
}
int main()
{
  int arr[] = { 1,3,5,7,9,2,4,6,8,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  bubble(arr, sz, sizeof(arr[0]), int_cmp);
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

 

🚀结语:

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

相关文章
|
C语言
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
363 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
272 1
IBSS、BSS和ESS之间的区别
【8月更文挑战第23天】
1408 0
|
存储 Ubuntu 测试技术
如何在 Ubuntu 或 Debian VPS 上配置 Apache Web 服务器
如何在 Ubuntu 或 Debian VPS 上配置 Apache Web 服务器
317 0
|
9月前
|
人工智能 Cloud Native 关系型数据库
速递!阶跃星辰最新开源多模态模型上线阿里云魔搭
速递!阶跃星辰最新开源多模态模型上线阿里云魔搭
|
算法 小程序 IDE
c++primer plus 6读书笔记第一章预备知识
c++primer plus 6读书笔记第一章预备知识
127 1
|
easyexcel Java Maven
springboot使用EasyExcel导入导出填充,解决导出乱码问题(web)
springboot使用EasyExcel导入导出填充,解决导出乱码问题(web)
1774 5
|
项目管理 Docker 容器
云效常见问题之研发流程也进不去如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
233 0
|
机器学习/深度学习 IDE API
【Tensorflow+keras】Keras 用Class类封装的模型如何调试call子函数的模型内部变量
该文章介绍了一种调试Keras中自定义Layer类的call方法的方法,通过直接调用call方法并传递输入参数来进行调试。
164 4