项目建设网站,图片加文字,新开网店怎么推广,电商平台正在建设中网站页面目录: 冒泡排序的原理 主函数 冒泡排序函数 比较函数 交换函数 最终输出 完整代码 冒泡排序的原理:
冒泡排序的原理是#xff1a;从左到右#xff0c;相邻元素进行比较。每次比较一轮#xff0c;就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右…目录: 冒泡排序的原理 主函数 冒泡排序函数 比较函数 交换函数 最终输出 完整代码 冒泡排序的原理:
冒泡排序的原理是从左到右相邻元素进行比较。每次比较一轮就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
以从小到大排序为例第一趟比较后所有数中最大的那个数就会浮到最右边第二趟比较后所有数中第二大的那个数就会浮到倒数第二个位置……就这样一趟一趟地比较最后实现从小到大排序. 主函数: 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]);}
}