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