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

相关文章
|
7月前
|
搜索推荐 C语言
模拟实现qsort函数:冒泡排序详解
模拟实现qsort函数:冒泡排序详解
42 1
|
8月前
|
C语言
【C语言/数据结构】排序(选择排序,推排序,冒泡排序)
【C语言/数据结构】排序(选择排序,推排序,冒泡排序)
49 0
|
C语言
c语言用冒泡排序模拟实现qsort排序
c语言用冒泡排序模拟实现qsort排序
82 0
qsort函数和模拟实现qsort函数
qsort函数和模拟实现qsort函数
C#基础⑥.2——数组(冒泡排序、求最值、数组排序、forr反转)
一次语文测试后,老师让班长统计每一个学生的成绩并计算全班(全班共5人)的平均成绩,然后把所有成绩显示出来。
|
8月前
|
C语言
二分查找法的区间判断【C语言】
二分查找法的区间判断【C语言】
|
8月前
|
JavaScript 前端开发
sort函数排序
sort函数排序
71 0
sort函数排序
|
算法 搜索推荐 Shell
Shell编程之数组排序算法(冒泡排序、直接选择排序、反转排序)
1、数组排序(使用tr、sort、for) 操作步骤; 使用tr命令将数组内每个元素之间的空格替换为换行符; 之后使用sort命令按从小到大重新排序; 最后使用for循环遍历排序后的元素值。
494 0
|
8月前
Qsort函数实现对各类型数组中元素的排序(思路简单)
Qsort函数实现对各类型数组中元素的排序(思路简单)
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
78 0

热门文章

最新文章