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

小明 2025-05-02 01:23:12 6

目录:

           冒泡排序的原理

           主函数

           "冒泡排序函数"

           比较函数

           交换函数

           最终输出

           完整代码


冒泡排序的原理:

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

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


主函数:

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

        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

        int j = 0;

定义一个标志量,防止出现排序完成后还继续交换的情况

        int flag = 1;

每一趟进行冒泡排序

        for (j = 0; 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

        char temp = *e1;

        *e1 = *e2;

        *e2 = temp;

        e1++;

        e2++;

    }

}


最终输出:


完整代码如下:

#include 
//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 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  
The End
微信