1.什么是冒泡排序
核心思想:两相邻元素进行比较
排列n个元素,需要排列 n - 1 组(每组解决1个数字),每组排列 n-i-1 次(排列好的数字不再进行交换)。
这里我们移将数组元素升序排列进行解释说明。
第一组:从数组的首元素开始,将首元素和第二个元素进行比较,如果首元素大于第二个元素,将首元素和第二个元素进行交换,反之不换;之后再将第二个元素和第三个元素进行比较,如果第二个元素大于第三个元素,将第二个元素和第三个元素进行交换,反之不换;以此类推,交换了n-1次后,数组的最大元素就放在了数组的最后。
接着进行第二组:与第一组步骤类似,但是因为数组的最大元素放在了数组的最后,所以数组的最后一个元素不用比较,因此我们交换n-2次后,数组的第二大元素就放在了数组的倒数第二个地址中。
以此类推,我们 n-i 组排序时,我们需要交换 n-i-1 次元素,将数组的第 i 大元素放在倒数第 i 个位置中。
当我们进行第 n-1 组排序后,数组的元素将按升序排列。
但是我们需要思考一个问题,当我们还未经过进行 n-1 组排序,数组就已经是按升序排列,如果我们再接着进行比较,代码运行效率未免太过低。因此,我们思考该怎样解决这个问题呢?
我们可以通过在每组排列之前,先假设数组的元素按升序排列,如果这组元素排列时,只要有元素进行交换,我们就否认数组按升序排列,否则,跳出组排列循环。
但是我们发现,这种代码只能实现一种数组类型的排序,那当我们需要实现多种数组类型的排序时,这种代码就不再适用,那该怎么解决这个问题呢?
2.qsort函数
1.认识 qsort 函数
对数组的任何类型的元素进行排序
头文件<stdlib.h>
comper函数返回值 大于0,交换位置,等于或小于0,位置不变。
2.怎么使用qsort函数
以排列结构体数组元素为例。
1.创建结构体数组
2.使用qsort函数使结构体数组的元素按所需排列的成员进行排序
3.打印排好序的结构体数组
3. 用冒泡排序法模拟实现 qsort 函数
1.创建结构体数组
2.用自定义array_sort函数将结构体数组的元素按所需排列的成员进行排序
3.2.1 构建自定义array_sort函数,使用两个for循环将数组元素进行冒泡排序。并判断两个元素的所需排列的成员是否满足排序条件,如果不满足,需要将两个元素进行位置互换。用flag判断结构体数组是否已经排好序。
我们不知道结构体数组元素的类型,所以没办法通过指针变量得到所需元素的地址,但是我们有结构体数组首元素的地址 base 和每个元素所占的字节数 size ,所以,我们可以通过将首元素的指针类型强制转换成char* 类型,通过(char*)base + j * size 得到所需元素的地址
3.2.2.通过回调函数,判断结构体数组的两个元素的所需排列的成员的大小
3.2.3 如果不满足排列条件,需要将两个元素交换位置。
但是,我们并不知道这两个元素的类型,无法直接交换,但是我们知道每个元素占多少个字节width ,所以,我们可以将两个元素一个字节一个字节的进行交换。这时,我们可以将两个元素的指针类型强制转换为char* 类型。
4 打印排好序的结构体数组