我们能很容易地实现冒泡排序,代码如下:
void Bubble_sort(int arr[],int n)//冒泡排序
{
int i = 0;
int j = 0;
for(j=0; j<n-1; j++)
{
for(i=0; i<n-1; i++)
{
if(arr[i+1]<arr[i])
{
int tmp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = tmp;
}
}
}
}
但这仅能实现对int类型的数组排序;那么其他类型的呢?
对冒泡排序的代码进行分析可以看出,冒泡排序分为这样几步:
1:选中数组中两个相邻的数;
这一步我们可以通过双层for循环来实现,通用版也可以
2:对相邻的两个数进行比较;
这一步在通用版中需要稍作改变:
int int_cmp(const void * p1, const void * p2)//比较两个整型
{
return (*(int *)p1 > *(int *)p2);
}
int char_cmp(const void * p1, const void * p2) //比较两个字符
{
return(*(char*)p1 > *(char*)p2);
}
int cmp_double(const void *p1, const void *p2)//比较两个double型
{
if ((*(double*)p1 - *(double*)p2) >0)
{
return 1;
}
else
return 0;
}
同理可以写出许多类型的比较函数
3:若是两数比较结果与整体排序不匹配则交换两数;
void swap(void* p1, void* p2, int size) //size为p1,p2两数的类型的大小
{
int i = 0;
for(i=0; i<size; i++)
{
char tmp = *((char*)p1 + i);
*((char*)p1 + i) = *((char*)p2 + i);
*((char*)p2 + i) = tmp;
}
}
根据这3步我们可以写出通用冒泡排序的代码如下:
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
int i = 0;
int j = 0;
for(i=0; i<count-1; i++)
{
for(j=0; j<count-i-1; j++)
{
if(cmp((char*)base + j*size , (char*)base + (j+1)*size ) > 0)
{
swap((char*)base + j*size, (char*)base + (j+1)*size, size);
}
}
}
}
完整的代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{
return (*(int *)p1 > *(int *)p2);
}
int char_cmp(const void * p1, const void * p2)
{
return(*(char*)p1 > *(char*)p2);
}
int cmp_double(const void *p1, const void *p2)
{
if ((*(double*)p1 - *(double*)p2) >0)
{
return 1;
}
else
return 0;
}
void swap(void* p1, void* p2, int size)
{
int i = 0;
for(i=0; i<size; i++)
{
char tmp = *((char*)p1 + i);
*((char*)p1 + i) = *((char*)p2 + i);
*((char*)p2 + i) = tmp;
}
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
int i = 0;
int j = 0;
for(i=0; i<count-1; i++)
{
for(j=0; j<count-i-1; j++)
{
if(cmp((char*)base + j*size , (char*)base + (j+1)*size ) > 0)
{
swap((char*)base + j*size, (char*)base + (j+1)*size, size);
}
}
}
}
int main()
{
int arr[] = {1,3,5,7,9,2,4,6,8,0};
char arr2[] = {'b','a','c','f','d'};
int i = 0;
int sz_arr = sizeof(arr)/sizeof(arr[0]);
int sz_arr2 = sizeof(arr2)/sizeof(arr2[0]);
bubble(arr, sz_arr, sizeof(int), int_cmp);
bubble(arr2, sz_arr2, sizeof(char), char_cmp);
for(i=0; i<sz_arr; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
for(i=0; i<sz_arr2; i++)
{
printf("%c ",arr2[i]);
}
printf("\n");
return 0;
}
运行结果为: