回调函数实现冒泡排序

       看到这个题目大家首先想到的就是不就是个冒泡排序吗?这还不容易,双重for循环就可以实现它,一个用来控制比较的趟数,一个用来控制每趟比较的次数,但是请不要忽略我们使用的是回调函数的方法,不是普通的冒泡排序奥!下面我们就来具体的理解一下什仫是回调函数以及如何使用回调函数来实现冒泡排序。

什仫是回调函数?

       回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用它所指向的函数时,我们就说这就是回调函数。

回调函数一般用来做什仫?

     要理解回调函数,我们先借助qsort来理解回调函数,打开MSDN查找 qsort_快速排序的函数原型:
     void qsort(void *base,size_t num,size_t width,int (_cdecl *compare)(const void *elem1,const void *elem2));
     
base:MSDN中说的是:Start of target array,它应该就是指目标数组的起始位置,也就是说它是你要进行排序的数组的首地址。
num:首先我们先看它的类型是size_t就是unsigned int类型的,然后我们再来看它的意义,在MSDN中说:Array size in elements,说明这个类型指的是数组的长度。
width:它的类型和num是一致的,不过它指的可不是数组的长度,它指的是数组中每个元素的类型大小。
compare:它是一个函数指针,这就和之前介绍的回调函数联系起来了,这个函数指针具有两个参数,通过它来判断要比较元素的类型,它的返回值类型为三种:正,负和零。

      qsort可以用来排序多种类型:一维数组,字符串,结构体,浮点型的数据,...它是通用的,可以在compare这个函数指针里传不同类型参数的地址来实现不同类型数据的排序。
      好了说了这仫多,下面我们来看一个简单地例子:
     下面我们就用一个简单地程序来实现qsort对整形数据的排列来加深对回调函数和函数指针的理解:
    
int cmp_int(const void *elem1, const void *elem2 ) 
{
	return *(int *)elem1 - *(int *)elem2;
}

int main()
{
	int arr[10];
	int sz = sizeof(arr)/sizeof(arr[0]);
	int i = 0;
	printf("请输入你要排序的数组元素:");
	for(i=0;i<sz;i++)
	{
		scanf("%d",&arr[i]);
	}
	qsort(arr, sz, sizeof(arr[0]), cmp_int);  //用快速排序升序排列
	printf("使用qsort之后的数组为:");
	for(i = 0;i<sz; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}
 下面是我们这个例子的实验结果:

       通过这个简单地例子大家是不是对回调函数有了比较全面的理解呢?下面就让我们继续努力采用qsort(快速排序)使用回调函数的方法来实现一个比较全能的冒泡排序,可以实现不同数据类型的排序:
       如何去分析这个特殊的冒泡排序呢?我们先来看一个函数调用的例子:
      
int int_cmp(void *str1, void *str2)
{
    return *(int *)str1 > *(int *)str2 ? 1:0;
}

int char_cmp(void *str1,void *str2)
{
	return *(char *)str1 > *(char *)str2 ? 1:0;
}

void swap(void *arr[], int x, int y)
{
    void *tmp;
	tmp = arr[x];
    arr[x] = arr[y];
    arr[y] = tmp;
}

void bubble_sort(void *arr[], int len,int (*cmp)(void *a, void *b)) //第三个参数为函数指针,应用了回调函数
{
    int i=0;
	int j=0;
	for (i = 0; i < len-1; i++)   //控制比较的趟数
    {
        for (j = 0; j < len-i-1; j++)   //控制每趟比较的次数
        {
            if (cmp(arr[j],arr[j+1]) == 1)
                swap(arr,j,j+1);
        }
    }
}

int main()
{    
	int i=0;
    int sz = 10;
    void *arr[10];        //void 类型的指针数组
	printf("请输入你要排序的元素>:");
	for (i = 0; i < sz; i++)
    {
        arr[i] =(int *)malloc(sizeof(int));
        scanf("%d",(int *)arr[i]);
    }
	bubble_sort(arr,sz,int_cmp);//  冒泡实现升序排列
	printf("输出后的结果是>:");
    for (i = 0; i < sz; i++)
    {
        printf("%d ",*(int *)arr[i]);
    }
	printf("\n");
    free(arr);
	system("pause");
	return 0;
}
            
        以上代码实现的是整形数组的排序,同用qsort来实现整形数组类似,下面我们就借助下面一个图来理解用回调函数实现冒泡排序的函数调用过程:
        
       
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值