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

相关文章
|
6月前
|
搜索推荐 C语言
模拟实现qsort函数:冒泡排序详解
模拟实现qsort函数:冒泡排序详解
38 1
|
C语言
c语言用冒泡排序模拟实现qsort排序
c语言用冒泡排序模拟实现qsort排序
78 0
qsort函数和模拟实现qsort函数
qsort函数和模拟实现qsort函数
|
7月前
|
搜索推荐 C语言
冒泡排序模拟实现qsort()函数
冒泡排序模拟实现qsort()函数
44 0
|
7月前
|
JavaScript 前端开发
sort函数排序
sort函数排序
57 0
sort函数排序
|
7月前
Qsort函数实现对各类型数组中元素的排序(思路简单)
Qsort函数实现对各类型数组中元素的排序(思路简单)
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
70 0
LetCode第912题 排序数组之冒泡排序
依次比较相邻的两du个数,将小数放在前面zhi,大数放在后面。即首先比较第dao1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。
52 0
LetCode第912题 排序数组之冒泡排序
|
搜索推荐 C++
深入解析 qsort 排序(上),它为什么是万能排序?
深入解析 qsort 排序(上),它为什么是万能排序?
109 0
|
C语言 数据库管理
还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!
还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!
83 1