引言:通过参考c语言库函数qsort:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

完成回调函数实现冒泡排序字符串或数字:

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
函数功能:以char类型交换两个元素,大小为size。
*/
void swap(char *p1,char *p2,int size)
{
	int i = 0;
	char tmp = 0;
	for(i = 0;i<size;i++)
	{
		tmp = *(p1+i);
		*(p1+i) = *(p2+i);
		*(p2+i) = tmp;
	}
}
/*
函数功能:比较整数的回调函数。
*/
int compare_int(const void *elem1,const void *elem2)
{
	return (*(int *)elem1) - (*(int *)elem2);
}
/*
函数功能:比较字符串的回调函数。
*/
int compare_str(const void *elem1,const void *elem2)
{
	return strcmp((char *)(*(int *)elem1), (char *)(*(int *)elem2));
}
/*
函数功能:冒泡排序函数。
*/
void bubble_str_int(void *base,int size,int width,int ( *cmp )(const void *elem1, const void *elem2 ))
{
	int i = 0;
	int j = 0;
	for(i = 0;i<size-1;i++)
	{
		for(j = 0;j<size-i-1;j++)
		{
			if(cmp(((char *)base+(j*width)),((char *)base+(j+1)*width))<0)
			{
				swap((char *)base+(j*width),(char *)base+(j+1)*width,width);
			}
		}
	}
}
int main()
{
	char *arr_str[] = {"ddddd","aaaaa","ccccc","bbbbb","zzzzz"};
	int arr_int[] = {1,3,5,7,9,2,4,6,8,10}; 
	int i = 0;
	int size_int = sizeof(arr_int)/sizeof(arr_int[0]);
	int size_str = sizeof(arr_str)/sizeof(arr_str[0]);
	bubble_str_int(arr_int,size_int,sizeof(arr_int[0]),compare_int);
	printf("bubble_sort int:\n");
	for(i = 0;i<size_int;i++)
	{
		printf("%d ",arr_int[i]);
	}
	printf("\n");
	bubble_str_int(arr_str,size_str,sizeof(arr_str[0]),compare_str);
	printf("bubble_sort string:\n");
	for(i = 0;i<size_str;i++)
	{
		printf("%s\n",arr_str[i]);
	}
	system("pause");
	return 0;
}

运行结果:wKiom1Zlh-qBpc48AAAIvyknfHY785.gif

注:主要思想:排序的是什么元素都将其强制类型转换成(char*),因为可以把char当作一个基类。然后再根据排序元素的类型,将其强制类型转化成目标类型.

例如:

int compare_int(const void *elem1,const void *elem2)
{
	return (*(int *)elem1) - (*(int *)elem2);
}

把基类强制类型转换成int*再*就得到int类型的数据。compare_int函数也是如此。