C言語の一般的なプログラミング-一般的なバブリング

一般的なバブリング(Tencentインタビューの質問)

ジェネリックスは、その名前が示すように、データ型に固執するのではなく、いくつかの一般的な関数を通じてさまざまなニーズを実現することで、コードの量を減らし、プログラムの汎用性を向上させます。

あまり言わないで、例に進んでください

//泛型冒泡(腾讯面试题)
#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;

}

プログラムの結果は次のとおりです。

ここに画像の説明を挿入

役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/Gunanhuai/article/details/90574599