1.常规的只能处理一种类型的冒泡排序
#include"stdio.h"
void bubble(int *arr, int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
#include"stdio.h"
int main()
{
int arr[] = { 1, 6, 8, 7, 5, 9, 0 };
int i = 0;
bubble(arr, sizeof(arr) / sizeof(arr[0]) );//对数组中的元素进行排序
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
2.进行优化后可以处理任意类型的冒泡排序
#include"stdio.h"
int int_cmp(const void *p1, const void *p2)//int_cmp为函数
{
return (*(int *)p1 > *(int *)p2);//将p1,p2转化为int型指针,解引用为其指向的内容;\
若为字符串比较则转化为char型指针
}
void swap(void *p1, void *p2, int size)
{
int i = 0;
char *pp1 = (char *)p1;
char *pp2 = (char *)p2;
for (i = 0; i < size; i++)//从第一个字节交换到第size个字节处
{
char tmp = *(pp1 + i);
*(pp1 + i) = *(pp2 + i);
*(pp2 + i) = tmp;
}
}
void bubble(void *p, int count, int size, int(*cmp)(void *, void *))//函数和数组作参数时,要退化成指针\
int(*cmp)(void *, void *)为指向参数为两个void*,返回值为int型 的指针
{
int i = 0;
int j = 0;
for (i = 0; i < count - 1; i++);//排序的次数为count-1,如果有10个数,只需要排9次序
{
for (j = 0; j < count - 1 - i; j++)//每次内部排序都需要count-1-i次,
{
if (cmp((char *)p + j*size, (char *)p + (j + 1)*size)>0)//将p转化为char型,加上j个int型的字节\
就相当于跨过了一个int 型的元素,即可进行任意类型的排序。
{
swap((char *)p + j*size, (char *)p + (j + 1)*size, size);
}
}
}
}
int main()
{
int arr[] = { 1, 6, 8, 7, 5, 9, 0 };//arr中也可以是字符串
//arr[]={"aaa","bbb","ccc"};
int i = 0;
//计算出数组的大小,bubble函数的参数中要用到
bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);//对数组中的元素进行排序
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);//若为字符串,则输出%s
}
printf("\n");
system("pause");
return 0;