C语言冒泡排序、qsort函数和模拟实现
通过不断学习C语言中的指针我们知道了函数的调用,那调用函数到底怎么用,接下来通过几个例子来逐步了解
本篇文章主要包括以下几个部分:
一、冒泡排序的实现和优化
二、.qsort函数的使用
三、qsort函数的模拟实现
一、冒泡排序的实现和优化
排序的方法有很多种,冒泡排序是其中较为简单的一种,下面介绍一下
1.冒泡排序的操作原理
是通过两个数两两比较,将大的数放在后面,小的数放在前面来排序的,将第一次的两个数放置好再选下两个数
2.用函数的方法实现冒泡函数
首先要创建一个数组(数组要是乱序的)并将这个数组的长度计算出来,将这两个数传入我们要写的冒泡函数,方便下一步操作
这里可以分为3分部分
1.这里的循环是控制一共要跑多少趟
5 4 3 2 1
4 5 3 2 1 一趟
4 3 5 2 1 两趟
4 3 2 5 1 三趟
4 3 2 1 5 四趟
这是一个数放置完成要(n-1)趟就是这里的(sz - 1)
2.这里控制的是要比较剩余的数据,即充当前位置比较到最后一个结束
最后一个数据下标标为sz-1,比较过的数刚好为i,这也就是为什么i不从1开始
3.这里就是创建一个变量来交换交换两个数组的元素
这里将打印数组的函数加上就可以运行代码了,可以正常运行没问题但是有个问题,当本身的数组里的元素就已经有序,在进行后续的趟数是不是有些多于呢,所以我们可以将这个代码改进一下
3.冒泡排序的改进
这样改进的代码在进行第一次时如果已经有序就不会进行后续的操作了
二、qsort函数的使用(如果不明白可以先看三)
上面的方式实现的函数,如果遇到不是整数的形式就无法进行排序了,而当我们学习过指针后就知道C语言中有一个函数可以排序非整形的元素,那么这个函数该怎么去使用呢
1.qsort的传参
2.qsort 的使用
知道了传参就可以去使用这个函数了
2.1 qsort 排序整形数据
1.这里上面不能对指针直接解引用,因为void类型的指针不可以进行操作,将其转换位int类型后在进行解引用后相减
2.2 qsort 排序结构数据
1.创造结构体
2.按照年龄排序
1.这里也是一样的强制类型转换
结果如下:
3.按名字排序
通过strcmp函数可以比较两个字符串,要包含<string.h>头文件,这个函数的返回值可以理解为大于为>0的值,小于返回<0的值,等于这返回0
使用这个函数可以将名字按照首字母排序(如果想反过来就将strcmp中的函数对调)
结果如下
三、qsort函数的模拟实现
1.构思
想去实现排序首先要有排序数,那摩就要有首元素地址,单个元素的长度,总长度,而要想对任何的数据进行排序那么就要将函数进行传递,我们可以通过函数的指针来用函数
以上是对两个数的比较,而大的形式则还用冒泡排序
1.我们想要首元素地址但又不知道转过来的是什么类型的所以用void来接收
2.将要比较的元素转化为char类型的这样没加一就仅仅跳过一个字节如果用int*则跳过4个字节
3.这里的for是为了让其一个字节一个字节的交换
结果如下:
所有代码如下
这个函数模拟实现还是有难度的,给自己多一点时间去理解,有问题大家可以指出,一起加油!