10分钟可学会的用《冒泡排序》排序任何数据类型,模拟qsort函数

简介: 10分钟可学会的用《冒泡排序》排序任何数据类型,模拟qsort函数

目录

1.qsort函数原型

2.qsort函数怎么使用

3.用冒泡排序模拟qsort函数来排序任何数据类型。

(1)冒泡排序算法。

(2)模仿qsort函数的用法,写成一个函数指针。

4.❤️整体实现逻辑(画图分析)

(1)调用bubble函数,将四个实参分别穿给形参

(2)通过函数指针p调用比较函数。

(3)调用swap函数。实现数据类型的逐个字节的交换

(4)最后打印显示

🔊🔊🔊

🇨🇳大家好,我是_奇奇,暂时为一名C语言博主。河牧院大一在读。

🔔喜欢交朋友,欢迎大家和我一起交流学习

❤️编程的前途是光明的,道路是曲折的。笑到最后才是赢家🍺

🌳我觉得坦途在前,人又何必为了一些小障碍而不走路呢 --鲁迅


1.qsort函数原型

qsort函数C语言函数库自带的排序函数。它可以排序所有的数据类型。包括年龄,姓名,结构体。等等

q代表quick的意思。sort是排序的意思。(所以称为快速排序)

qsort 的函数原型如下,一共四个形参。qsort函数包含在C 标准库 - <stdlib.h>中。


void qsort( void *base, //base是要排序数组的首元素地址

int num, //num是要排序数组的长度

int width, //width需要排序的元素的数据类型大小(单位是字节)

int ( *compare )(const void *e1, const void *e2 ) );//函数指针,调用compare函数


2.qsort函数怎么使用

  • qsort函数的实现原理还是运用了函数指针来实现的。运用了回调函数。
  • 戳链接,见上一篇博客回调函数的介绍《函数指针的应用
  • qsort库函数按升序排序整型方法如下。
#include<stdlib.h>
#include<stdio.h>
//第二步,比较
int cmp(const void* e1, const void* e2)
{
  //只需要我们写一个这样的比较函数就可以了
  return *(int*)e1 - *(int*)e2;
}
//第三步,打印
void Print(int* arr, int num)
{
  int i = 0;
  for (i = 0; i < num; i++)
  {
    printf("%d ", *(arr + i));
  }
}
//第一步,主函数调用qsort函数
int main()
{
  int arr[] = { 5,4,3,2,1 };
  int num = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, num, sizeof(arr[0]), cmp);
  Print(arr, num);
  return 0;
}

3.用冒泡排序模拟qsort函数来排序任何数据类型。

(1)冒泡排序算法。

下面这个普通的冒泡排序代码来排序整型数组。但这个冒泡排序比较局限,只会用来排序整型。现在怎么把它变为通用的排序算法,让它成为万能的排序模板呢?接下来函数指针就登场了~

#include<stdio.h>
void Bubble(int* arr, int sz)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < sz - 1; i++)
  {
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        int t = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = t;
      }
    }
  }
}
void Print(int* arr, int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
}
int main()
{
  int arr[] = { 5,4,3,2,1 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  Bubble(arr, sz);//排序
  Print(arr, sz);//打印
  return 0;
}

(2)模仿qsort函数的用法,写成一个函数指针。

通过我的经验。会发现,现在的问题是假如现在需要比较字符串的话,那么红色方框里的方法已经不适合,应该用strcmp函数。所以要把这一部分单独抽出来,利用指针按照实际情况去调用我们需要的比较函数。

整体代码

/*qsort函数冒泡排序模拟*/
#include<stdio.h>
int cmp(const void* e1, const void* e2)
{
  return *(char*)e1 - *(char*)e2;
}
void swap(char* x, char* y, int base)
{
  int i = 0;
  for (i = 0; i < base; i++)
  {
    char t = 0;
    t = *x;
    *x = *y;
    *y = t;
    x++;
    y++;
  }
}
void Bubble(int* arr, int sz, int base, int (*p)(const void* e1, const void* e2))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < sz - 1; i++)
  {
    for (j = 0; j < sz-1-i; j++)
    {
      if (p((char*)arr+j*base, (char*)arr+(j+1)*base)>0)
      {
        swap((char*)arr + j * base, (char*)arr + (j + 1) * base, base);
      }
    }
  }
}
void Print(int* arr, int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
}
int main()
{
  int arr[] = { 5,4,3,2,1 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  Bubble(arr, sz, sizeof(arr[0]),cmp);
  Print(arr, sz);
  return 0;
}

4.❤️整体实现逻辑(画图分析)

(1)调用bubble函数,将四个实参分别穿给形参


(2)通过函数指针p调用比较函数。

(3)调用swap函数。实现数据类型的逐个字节的交换

(4)最后打印显示

相关文章
|
11月前
|
存储 缓存 关系型数据库
详细解析MySQL中的innodb和myisam
总之,InnoDB和MyISAM各有千秋,选择合适的存储引擎应基于对应用程序特性的深入理解,以及对性能、数据完整性和可扩展性的综合考量。随着技术发展,InnoDB因其全面的功能和日益优化的性能,逐渐成为更广泛场景下的首选。然而,在特定条件下,MyISAM依然保留其独特的价值。
322 0
JAVA中void关键字
JAVA中void关键字
259 1
|
JavaScript 前端开发
JavaScript中比较常见的几种弹窗
JavaScript中比较常见的几种弹窗
159 1
|
存储 算法 关系型数据库
「mysql优化专题」视图应用竟然还可以这么优化?不得不收藏(8)
当一个大型系统在建立时,会发现,数据库虽然可以存储海量的数据,可是一旦数据关系复杂,比如学生表(学号、姓名、年龄),学生成绩表(学号、科目、成绩),如需要姓名、科目、成绩组成关系,这样的情况我们选择创建一个新表是非常浪费资源的动作,为此,视图诞生了! 一、视图概述: (1)什么是视图? 视图是基于 SQL 语句的结果集的可视化的表。
|
Web App开发 云安全 物联网
开年采购季 - 时间点排序攻略
元宵将过,想必大家对于新一年的规划都是启动状态了,而阿里云为大家准备了开年采购季活动,提供了超多优惠,本次优惠同双11大促同规格。为了让大家不错过本次活动,博主本人特别整理出关键的优惠时间点,供大家关注。
2786 0
|
8天前
|
人工智能 运维 安全
|
6天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
639 22
|
7天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
13天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
1041 110