泛型冒泡(腾讯面试题)
泛型,顾名思义,就是不不拘泥于数据类型,通过一些通用的函数来实现各种需求,从而减少代码量,提高程序的通用性。
话不多说,直接上例子
//泛型冒泡(腾讯面试题)
#include<stdio.h>
#include<stdarg.h>
#include<stdlib.h>
#include<string.h>
typedef int(*Fun)(void *vp1,void *vp2); //泛型冒泡排序
int Cmp_int(void *vp1,void *vp2)
{
return *(int *)vp1 - *(int *)vp2;
}
int Cmp_str(void *vp1,void *vp2)
{
return strcmp(*(char **)vp1,(*(char **)vp2));
}
int Cmp_double(void *vp1,void *vp2)
{
#define EPS 0.000001
double tmp = *(double *)vp1 - *(double *)vp2;
if(tmp > EPS)
{
return 1;
}
if(tmp = EPS)
{
return 0;
}
if(tmp < -EPS)
{
return -1;
}
}
int Cmp_single_letter(void *vp1,void *vp2)//单字符排序
{
return *(char*)vp1-*(char *)vp2;
}
void Swap(void *vp1,void *vp2,int size)
{
void *tmp = malloc(size);
memcpy(tmp,vp1,size);
memcpy(vp1,vp2,size);
memcpy(vp2,tmp,size);
free(tmp);
}
void BubbleSort(void *arr,int len ,int elemsize, Fun cmp)
{
void *tmp = malloc(elemsize);
//bool flag;
int flag;//标记是否发生了数据交换,若无交换则已经处于有序状态,无需再往下进行遍历
void *base;
void *base_next;
for(int i=0;i<len-1;i++)
{
flag = 0;
for(int j=0;j<len-i-1;j++)
{
base = (char *)arr+j*elemsize;
base_next = (char *)arr+(j+1)*elemsize;
if(cmp(base,base_next) > 0)
{
Swap(base,base_next,elemsize);
flag = 1;
}
}
if(flag==0) break; //没有进行交换,已有序
}
free(tmp);
}
int main()
{
int arr[]={6,3,2,6,4,7,3,8,3,787,3,6};
BubbleSort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),Cmp_int);
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
printf("%d ",arr[i]);
}
puts(" ");
char *brr[]={"ert","fd","udi","fdc","ruy"};
BubbleSort(brr,sizeof(brr)/sizeof(brr[0]),sizeof(char *),Cmp_str);
for(int i=0; i<sizeof(brr)/sizeof(brr[0]); i++)
{
printf("%s ",brr[i]);
}
puts(" ");
double crr[]={1.2,5.6,7.8,355.7,3.8,56.9};
BubbleSort(crr,sizeof(crr)/sizeof(crr[0]),sizeof(double),Cmp_double);
for(int i=0; i<sizeof(crr)/sizeof(crr[0]); i++)
{
printf("%g ",crr[i]);
}
puts(" ");
//bug
char drr[]={'c','e','d','a','b'};
BubbleSort(drr,sizeof(drr)/sizeof(drr[0]),sizeof(char),Cmp_single_letter);
for(int i=0; i<sizeof(drr)/sizeof(drr[0]); i++)
{
printf("%c ",drr[i]);
}
puts(" ");
return 0;
}
程序运行结果如下:
希望对您有所帮助
不足之处还请多多指教!