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