博客
关于我
用冒泡排序模拟实现qsort函数
阅读量:759 次
发布时间:2019-03-23

本文共 2310 字,大约阅读时间需要 7 分钟。

昨天大概讲解了一下qsort函数及其简单应用。我们再看一遍qsort函数:

void qsort(void * base, int  size, int num, int(*cmp)(void *, void *));

 下面我们用冒泡排序模拟实现一下,如下:

#define _CRT_SECURE_NO_WARNINGS 1#include 
#include
#include
//void qsort(void * base, int size, int num, int(*cmp)(void *, void *))struct stu{ char name[20]; int age;};void Swap(char *buf1, char*buf2, int width){ int i = 0; for (i = 0; i < width; i++) { char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; }}void Bubble_sort(void * base, int size, int width, int(*cmp)(void *, void *)){ int i = 0, j = 0; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - i - 1; j++) { //强制类型转换为char *类型,用上宽度width,就可以巧妙地转到不同类型的数据 if (cmp_int((char*)base + j*width, (char*)base + (j + 1)*width)>0) { Swap((char*)base + j*width, (char*)base + (j + 1)*width, width); } } }}int cmp_int(const void * e1, const void * e2){ return *((int *)e1) - *((int *)e2);}int cmp_float(const void * e1, const void * e2){ return (int)(*((float *)e1) - *((float *)e2));}int cmp_stu_by_name(const void * e1, const void * e2){ return strcmp(((struct stu *)e1)->name, ((struct stu *)e2)->name);}int cmp_stu_by_age(const void * e1, const void * e2){ return ((struct stu *)e1)->age - ((struct stu *)e1)->age;}void Print1(struct stu s[3]){ int i = 0; for (i = 0; i < 3; i++) printf("%d ", s[i].age); printf("\n");}void test1(){ int arr[] = { 4, 5, 6, 7, 8, 9, 1, 2, 3, 0 }; int sz1 = sizeof(arr) / sizeof(arr[0]); Bubble_sort(arr, sz1, sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < 10; i++) printf("%d ", arr[i]); printf("\n");}void test2(){ float brr[] = { 3.0, 2.0, 4.0, 5.0, 7.0, 4.0 }; int sz2 = sizeof(brr) / sizeof(brr[0]); Bubble_sort(brr, sz2, sizeof(brr[0]), cmp_float); int i = 0; for (i = 0; i < 6; i++) printf("%f ", brr[i]); printf("\n");}void test3(){ struct stu s[3] = { { "zhangsan", 15 }, { "lisi", 23 }, { "wangwu", 8 } }; int sz3 = sizeof(s) / sizeof(s[0]); Bubble_sort(s, sz3, sizeof(s[0]), cmp_stu_by_name); Print1(s);}void test4(){ struct stu s[3] = { { "zhangsan", 15 }, { "lisi", 23 }, { "wangwu", 8 } }; int sz3 = sizeof(s) / sizeof(s[0]); Bubble_sort(s, sz3, sizeof(s[0]), cmp_stu_by_age); Print1(s);}int main(){ test1(); test2(); test3(); test4(); return 0;}

今天就简单说到这了。

   作者会每天分享自己的C语言学习心得,记录自己C语言学习之路,欢迎大家指正,感谢支持~

 

 

转载地址:http://icvzk.baihongyu.com/

你可能感兴趣的文章
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>