#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int tmp_int(const void* e1, const void* e2)
//接收指针变量,再解引用
{
int ret = *(int*)e1 - *(int*)e2;
return ret;//e1,e2是一个void类型的指针,要强制类型转换为int指针,最后*解引用
}
void Swap(char* buff1,char* buff2, int width)
{
int i = 0;
//这里交换的是字节,如,一个整形4个字节,也就是width,将每个字节交换即可。
for (i = 0; i < width; i++)
{
char tmp = 0;
tmp = *buff1;
*buff1 = *buff2;
*buff2 = tmp;
buff1++;
buff2++;
}
}
void Bubble_sort(void* base,int sz,int width,int(*tmp_int)(const void* e1, const void* e2))
//传参时不知道排序类型,所以base反应初始时元素首地址,然后是元素个数,每个元素的宽度,最后传入函数指针
//int(*tmp_int)(const void* e1, const void* e2)翻译:tmp_int为类型为参数是const void* e1, const void* e2返回类型为int的指针变量,函数名为tmp_int
{
int i = 0;
for (i = 0; i < sz - 1; i++)//只需要从第一个元素开始交换sz-1轮(一轮包含所有元素)
{
int j = 0;
int flag = 1;//建立一个flag防止本就是排好序的情况下重复运行
for (j = 0; j < sz - 1 - i; j++)
{
if (tmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0)
//回调比较函数,采用用函数指针找到函数并传参的方式,应不知比较的元素类型所以用最小的char类型+元素宽度就行了,注意这里传的是指针
{
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//注意传入元素宽度
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[10] = { 2,3,5,1,4,7,8,6,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
Bubble_sort(arr, sz,sizeof(arr[0]),tmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}