目录:
冒泡排序的原理
主函数
"冒泡排序函数"
比较函数
交换函数
最终输出
完整代码
冒泡排序的原理:
冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
以从小到大排序为例,第一趟比较后,所有数中最大的那个数就会浮到最右边;第二趟比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一趟一趟地比较,最后实现从小到大排序.

主函数:

int main() {
这里我们创建了一个无规律的数组
    int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };
 
然后我们把数组的长度计算出来(总字节/单个元素的字节)
    int sz = sizeof(arr) / sizeof(arr[0]);
 
调用我们自己写好的"冒泡排序函数"(下面会解释)
    bubble(arr, sz, sizeof(arr[0]), compare_number);
 
遍历交换后的数组
    int i = 0;
     for (i = 0; i < sz; i++) {
         printf("%d ", arr[i]);
     }
}
 
"冒泡排序函数"

函数的返回值为void,参数是"起始数据地址","总长度","单个数据的字节数","自己定义的比较方法"
void bubble(void* base, int sz ,  int width, int (*cmp)(void* e1, void* e2)) {
     int i = 0;
 
第一层循环决定交换的趟数
     for (i = 0; i < sz; i++) {
         int j = 0;
 
定义一个标志量,防止出现排序完成后还继续交换的情况
         int flag = 1;
 
每一趟进行冒泡排序
         for (j = 0; j < sz - 1-i; j++) {
 
这里使用了一个自己写的比较函数,也就是自己想要的排序方法
             if (cmp((char*)(base)+j * width, (char*)(base)+(j + 1) * width)>0) {
 
这里是一个交换函数
                 Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width, width);
 
如果交换了就说明还没有排序完成,继续下一趟的排序
                 flag = 0;
             }
         }
         if (flag) {
             break;
         }
     }
 }
 
比较函数:

这里就是简单的大小比较,第一个数大就返回一个大于0的数
int compare_number(void* e1, void* e2) {
     return *(int*)e1 - *(int*)e2;
 }
 
交换函数:

运用的就是把每个元素指针指向的元素进行交换
void Swap(char*e1,char*e2,int width) {
     int i = 0;
     for (i = 0; i < width; i++) {
         char temp = *e1;
         *e1 = *e2;
         *e2 = temp;
         e1++;
         e2++;
     }
 }
 
最终输出:

完整代码如下:
#include <stdio.h>
//cmp
int compare_number(void* e1, void* e2) {return *(int*)e1 - *(int*)e2;
}
//Swap
void Swap(char*e1,char*e2,int width) {int i = 0;for (i = 0; i < width; i++) {char temp = *e1;*e1 = *e2;*e2 = temp;e1++;e2++;}
}
//冒泡排序  起始地址    数据长度  数据宽度   比较方法函数
void bubble(void* base, int sz ,  int width, int (*cmp)(void* e1, void* e2)) {int i = 0;//第一趟for (i = 0; i < sz; i++) {int j = 0;int flag = 1;for (j = 0; j < sz - 1-i; j++) {if (cmp((char*)(base)+j * width, (char*)(base)+(j + 1) * width)>0) {Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width, width);flag = 0;}}if (flag) {break;}}
}
int main() {	int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(arr[0]), compare_number);int i = 0;for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}
}