一、仿写冒泡排序函数原型(的使用)
#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* 类型指针、元素个数、单个元素字节数及比较函数指针。