C语言冒泡排序(高级版)

时间:2024-03-07 14:57:29

目录:

           冒泡排序的原理

           主函数

           "冒泡排序函数"

           比较函数

           交换函数

           最终输出

           完整代码


冒泡排序的原理:

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一趟比较后,所有数中最大的那个数就会浮到最右边;第二趟比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一趟一趟地比较,最后实现从小到大排序.


主函数:

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]);
	}
}