可对多种类型进行排序的冒泡排序

实现一个bubble_sort(冒泡排序),可以完成不同类型数据的排序

需要借助库函数qsort 的思想去实现!

先完成函数原型:void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b));

该函数的四个参数和qsort 的四个参数使用方法相同(如不清楚可参考我的上一篇对qsort详细介绍的博客);

同时需要完成比较函数,即第四个参数函数指针。


例(对整数的排序):

实现对整数的比较,

int  IntCmp(const void* a, const void* b)           //比较整型a,b的大小 
{
return (*(int*)a>*(int*)b) ? 1 : -1;
}


然后在void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b))函数内部按照一般的冒泡排序思路编程即可,

注意的是该函数在进行交换元素的时候以字节为单位进行交换;


交换函数如下:

void swap(size_t width, void* a, void* b)           //按字节将两任意类型交换 
{
char temp;
int k = 0;
for (k = 0; k<(int)width; k++)
{
temp = *((char*)a + k);
*((char*)a + k) = *((char*)b + k);
*((char*)b + k) = temp;
}
}


具体思路如上,我以整型排序和字符串数组的排序为例完成了以下代码:

#include<stdio.h>
#include<string.h>
int IntCmp(const void* a, const void* b)           //比较整型a,b的大小 
{
	return (*(int*)a>*(int*)b) ? 1 : -1;
}
int StrCmp(const void* a, const void* b)           //比较字符串数组(可理解为二级指针)的大小 
{
	return strcmp((char*)(*(int*)a), (char*)(*(int*)b))>0 ? 1 : -1;
}
void swap(size_t width, void* a, void* b)           //按字节将两任意类型交换 
{
	char temp;
	int k = 0;
	for (k = 0; k<(int)width; k++)
	{
		temp = *((char*)a + k);
		*((char*)a + k) = *((char*)b + k);
		*((char*)b + k) = temp;
	}
}
void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b))
{                  
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = 0; i<(int)num - 1; i++)
	{
		for (j = 0; j<(int)num - i - 1; j++)
		{
			ret = compare(((char*)base + j*width), ((char*)base + (j + 1)*width));  //前面数据大返回1,否则返回-1 
			if (ret>0)          //将大的数据换到后面 
			{
				swap(width, ((char*)base + j*width), ((char*)base + (j + 1)*width));
			}
		}
	}
}
int main()
{
	int i=0;
	int arr1[10]={1,3,5,7,9,2,4,6,8,10};
	int len=sizeof(arr1)/sizeof(arr1[0]);
	bubble_sort(arr1,len,sizeof(arr1[0]),IntCmp);
	for(i=0;i<len;i++)
	{
		printf("%d ",arr1[i]);
	}

	/*int i = 0;
	char* arr[4] = { "aaa", "ddd", "ccc", "bbb" };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, len, sizeof(arr[0]), StrCmp);
	for (i = 0; i<len; i++)
	{
		printf("%s ", arr[i]);
	}*/
	return 0;
}
整型排序结果:

字符串数组(二维数组)排序结果:



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值