C语言 / C#改造冒泡排序函数bubble_sort()
一、仿写冒泡排序函数原型(的使用)
#include <stdio.h>
//int arr[] 实际传递的是数组首元素地址,int arr[]也可以写成 int *arr
void Sort(int arr[], int sz)
{
int i = 0;
int count = 0;//趟数
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序,决定了一趟排序进行多少对比较
int j = 0;
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
count++;
}
printf("%d\n", count);
}
int main()
{
//整型数据
int arr[] = { 3,1,4,2,9,8,6,7,0,5 };
//写一个函数对数组进行排序
int sz = sizeof(arr) / sizeof(arr[0]);
Sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这段代码实现整型数组冒泡排序。
Sort 函数通过两层循环,内层比较相邻元素,若顺序不对则交换,外层控制趟数,并统计趟数输出。
main 函数定义整型数组,sz计算其大小,调用 Sort 排序后打印数组。
比如:
int arr[] = { 3,1,4,2,9,8,6,7,0,5 }; , 假设j=0时,
arr[j] > arr[j + 1] 3>1? 大于则交换
二、改造冒泡排序函数bubble_sort()
//二、改造冒泡排序函数,使得这个函数可以排序任意指定的数组
//实现一个比较整型的函数
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;//看返回值是 >0 <0 ==0
}
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i < width; i++)//eg: 比如int类型 width有4个字节,循环四次
{
char tmp = *buf1;//逐个字节进行地址所指向的内容的交换
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
//趟数
size_t i = 0;
for (i = 0; i < sz - 1; i++)//从0开始,要减1
{
//一趟冒泡排序的过程
size_t j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
//↓(char*)base:起始位置,char*是说按照字节向后偏移,
// j * width、(j + 1) * width是相对于数组起始地址base的偏移量
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
//交换(一个字节)
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
//使用我们自己写的bubble_sort函数排序整型数组
void test3()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
test3();
return 0;
}
cmp_int 函数:
比较两个 int 值,通过 e1 减 e2 返回比较结果,用于判断大小。
Swap 函数:
以字节为单位,交换 buf1 和 buf2 指向的 width 字节的数据。
bubble_sort 函数:
通用冒泡排序, base 是数组起始地址, sz 为元素个数, width 是单个元素字节数, cmp 是比较函数。
两层循环实现冒泡排序,根据 cmp 结果,用 Swap 交换元素位置。
test3 函数:
定义整型数组 arr ,计算其元素个数 sz 。
调用 bubble_sort 对 arr 排序,最后打印排序后的数组。
三、总结:
第一段代码仅针对整型数组排序, Sort 函数直接处理 int 数组,硬编码了数组类型和元素交换方式,未考虑通用性。
第二段代码通过函数指针和字节交换实现通用冒泡排序,能处理任意类型数组, bubble_sort 接受 void* 类型指针、元素个数、单个元素字节数及比较函数指针。