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)最后打印显示

相关文章
|
Web App开发 云安全 物联网
开年采购季 - 时间点排序攻略
元宵将过,想必大家对于新一年的规划都是启动状态了,而阿里云为大家准备了开年采购季活动,提供了超多优惠,本次优惠同双11大促同规格。为了让大家不错过本次活动,博主本人特别整理出关键的优惠时间点,供大家关注。
2817 0
|
11天前
|
数据采集 人工智能 安全
|
6天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
330 164
|
5天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
332 155
|
6天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
412 4