学习c语言的过程中少不了的就是排序,例如冒泡排序(不清楚的同学可以翻找一下之前的文章),
我们这里将冒泡排序作为一个自定义函数来呈现一下
#include<stdio.h>void bubble_sort(int arr[], int len)
{for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - 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 len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 14,32,62,54,23,61,9,67,83,0,34,10,89 };int len = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, len);Print(arr, len);return 0;
}
这里的自定义函数bubble_sort()完成的是排序,但是这里要足注意,我们的形参是限制死的int类型数据,那么如果我们想要排序字符数组、浮点数、结构体,这些都无法完成,
那么如果我们想要排序这些东西怎么办呢,
c语言给的库函数中qsort可以完成,
这里值得一提的是,qsort利用的是快速排序(这里不需要了解快速排序原理,与冒泡排序所达到的效果是一致的,只不过过程不同而已),
我们来看一下qsort函数的参数,(第四个参数为函数指针,我们要往里面传递函数地址),
下面是对qsort函数参数的解读,
base-指向待排序数组的第一个元素的指针,
num-base指向数组中元素的个数,
size-base指向的数组中一个元素的大小,单位为字节,
compar-
这里我们先来想一下,如果改写一开始写的冒泡排序来让它实现字符串的排序、浮点型数 组的排序、甚至是排序结构体数组,我们应该改写哪一部分,首先,循环的趟数不需要改 变,每趟需要比较的次数也是不变的,那么需要改的就是每次比较,如何比较,对于数字可 以用大于小于号,但是字符串呢,结构体呢,甚至说内部的交换也不能简单的使用赋值号来 进行,我们所需要改的即下面显示的部分,
那么compar就是指向一个函数,这个函数是用来比较两个数据的,
也就是说,当你想要使用qsort函数的时候,你只需要传进去一个你想要如何比较两个数据的 函数,qsort按照你的方法比就可以了,这样就实现了比较各种数据,
下面我们来看看如何使用qsort函数,
我们先对照上面的冒泡排序对其进行一个简单的改写,
这是对整型数组的排序,下面来看看如果是对结构体改如何使用,
注意:void*指针不能解应用,那么我们使用的时候需要强制转化一下
这里运用到了箭头操作符,可以简单理解为使用指针调用结构体成员时使用的操作符,不了解的小伙伴可以参考一下之前的文章,
不太清楚strcmp的小伙伴可以看一下,这里我们来简单介绍一下strcmp,
它的返回类型为int类型,
返回类型正好与我们的qsort函数第四个变量所需要的返回值一致,所以我们可以简化返回值部分的内容,
这里用strcmp排序名字的时候要注意,名字排序不是按照名字的长短进行排序的,是从第一个字母开始比较其ASCll码表对应的值,当两者出现不同数值时,后面
注意使用strcmp时,需要包含头文件#include<string.h>
到这里,我们的qsort函数就基本介绍完了。