浏览顺序:
main()函数->被调用函数。
关键函数只有十几行,细心浏览,祝君成功!
#include<stdio.h>
#include<string.h>
#include<assert.h>
//在这里我们先演示int和字符串两中类型的冒泡排序
void bubble_sort(void*data, int nums, int width, int(*cmp)(void*, void*));
int int_cmp(void*num1, void*num2);
int str_cmp(const void*num1, const void *num2);
int main()
{
int arr1[] = { 15, 1, 56, 6, 8, 6, 7, 5, 63, 5, 6 };
int arr2[] = { 'a', 'd', 'r,', 'm', 'g', 't', 'e', 'v', 'h', 'g', 'f', 'w', 'e', 'h' };
double arr3[] = { 1.2, 1.3, 2.3, 5.6, 1.0, 2.6, 7.8 };
/*定义字符指针数组arr4,即定义一个数组,数组的每个元素为一个指针,
该指针指向不同的字符串(指向一个个元素个数可以不同的字符数组,也就是指向不同的字符串)
*/
char *arr4[] = { "aaa", "cccc", "bbbbb" };
/*以上均为数组,求元素个数,求解类型一致*/
int sz1 = sizeof(arr1) / sizeof(arr1[0]);
int sz2 = sizeof(arr2) / sizeof(arr2[0]);
int sz3 = sizeof(arr3) / sizeof(arr3[0]);
int sz4 = sizeof(arr4) / sizeof(arr4[0]);
//打印排序前
for (int i = 0; i < sz1; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
//此处:bubble_sort函数第4个参数为函数指针,传参时,将相应类型的比较函数的地址赋给函数指针,进行函数调用
bubble_sort(arr1, sz1, sizeof(int), int_cmp);
//打印排序后
for (int i = 0; i < sz1; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
for (int i = 0; i < sz4; i++)
{
puts(arr4[i]);
}
printf("\n");
bubble_sort(arr4, sz4, sizeof(char*), str_cmp);
for (int i = 0; i < sz4; i++)
{
puts(arr4[i]);
}
printf("\n");
getchar();
return 0;
}
//
void bubble_sort(void*data, int nums, int width, int(*cmp)(void*, void*))
{
assert(data);
int i;
int j;
for (i = 0; i < nums - 1; i++)
{
int flag = 0;
char *start = (char*)data;//之所以可以排序任意类型,是因为进行交换一个不同数组元素时,全部转化为最小的char类型(*(char*)start)
for (j = 0; j < nums - i - 1; j++)
{
if (cmp(start, start + width)<0)
{
//按照元素类型以最小类型char进行交换
for (int k = 0; k < width; k++)
{
start[k] ^= start[k + width];
start[k + width] ^= start[k];
start[k] ^= start[k + width];
}
flag = 1;
}
start += width;
}
//添加flag,是为优化处理。当冒一次泡时,若没有发生交换,则直接跳出循环
if (!flag)
{
break;
}
}
}
int int_cmp(void*num1, void*num2)
{
return *(int *)num1 - *(int *)num2;
}
int float_cmp(const void*num1, const void*num2)
{
float ret = *(float*)num1 - *(float*)num2;
if (ret == 0)
{
return 0;
}
else if (ret < 0)
{
return -1;
}
else
{
return 1;
}
}
//字符比较函数
int char_cmp(const void *num1, const void*num2)
{
return *(char *)num1 - *(char *)num2;
}
//字符串比较函数
int str_cmp(const void*num1, const void *num2)
{
return strcmp(*(char**)num1, *(char **)num2);
}