通过回调函数的调用,实现数组的排序。
#include <stdio.h>
#define UP 0 //升序
#define DOWN -1 //降序
/******************注册回调***************************/
void fun(void *p, int flage,int num, void(*call)(void *,int,int))
{
call(p,flage,num);
}
/************冒泡排序***********/
void mao_sort(void *p, int flage,int num) //flage 排序标志 num元素各数
{
int *a = (int *)p;
int i,j;
for(i=0;i<num-1;i++)
{
for(j=0;j<num-i-1;j++)
{
if(flage==DOWN?(a[j]<a[j+1]):(a[j]>a[j+1]))
{
a[j]^=a[j+1];
a[j+1]^=a[j];
a[j]^=a[j+1];
}
}
}
}
/***********选择排序*************/
void select_sort(void *p, int flage, int num)
{
int *a = (int *)p;
int i, j, r;
for(i=0;i<num-1;i++)
{
r=i;
for(j=i+1;j<num;j++)
if(flage==DOWN?(a[j]<a[r]):(a[j]>a[r]))
r=j;
if(r!=i)
{
a[i] ^=a[r];
a[r] ^=a[i];
a[i] ^=a[r];
}
}
}
int main()
{
int a[]={43,65,2,8, 10};
fun((void *)a,UP,sizeof(a)/sizeof(int),mao_sort);
int i;
for(i=0;i<sizeof(a)/sizeof(int);i++)
printf("%d\t",a[i]);
printf("\n");
fun((void *)a,DOWN,sizeof(a)/sizeof(int),mao_sort);
for(i=0;i<sizeof(a)/sizeof(int);i++)
printf("%d\t",a[i]);
printf("\n");
int b[]={3,4,6,1,2,9,10,5,8,99};
fun(b, DOWN,sizeof(b)/sizeof(int),select_sort);
for(i=0;i<sizeof(b)/sizeof(int);i++)
printf("%d\t",b[i]);
printf("\n");
fun(b, UP,sizeof(b)/sizeof(int),select_sort);
for(i=0;i<sizeof(b)/sizeof(int);i++)
printf("%d\t",b[i]);
printf("\n");
}
程序运行结果:
2 8 10 43 65
65 43 10 8 2
1 2 3 4 5 6 8 9 10 99
99 10 9 8 6 5 4 3 2 1