20150124 【 Linux-C 函数指针 】 模拟快速排序程序--快排


快排的特点就是通用性;

只要你提供比较函数 cmp

它就能对任何类型的数据进行排序。



大一的时候很不解这玩意的原理,

现在总于知道了————>函数指针。。。



所以就手敲了一遍。


一个是标准的int数组排序,

另一个是结构体数组排序。


这里用宏定义控制。










#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

//#define USE_INT
//定义 USE_INT 时,TYPE_T 改为 int
#define TYPE_T		people
#define LEN_MAX		10100

const char alpha[] = "abcdefghijklnmopqrstuvwxyz";
const int alphaLen = sizeof(alpha)-1;

typedef struct _people
{
	int age;
	char name[123];
}people;


void t_sort(TYPE_T *src, TYPE_T *aim, int n, int (*p)(const TYPE_T *x, const TYPE_T *y))
{
	int i=0, j=0, flag=0;
	TYPE_T tmp;
	TYPE_T *maxx=NULL, *temp=NULL;
	
	for(i=0; i<n; i++)
	{
		aim[i] = src[i];
	}

	for(i=0; i<n; i++)
	{
		flag = i;

		for(j=i+1; j<n; j++)
		{
			if( (*p)(aim+j, aim+flag) )
				flag = j;
		}
		
		tmp = aim[flag];
		aim[flag] = aim[i];
		aim[i] = tmp;
	}
}

TYPE_T src[LEN_MAX], aim[LEN_MAX];

int t_cmp(const TYPE_T *a, const TYPE_T *b)
{
#ifdef USE_INT
	return *a < *b;
#else
	if( a->age == b->age )
		return strcmp(a->name, b->name) < 0;
	return a->age < b->age;
#endif
}

TYPE_T t_rand_num(void)
{
	TYPE_T res;
	int i=0, len=5;

#ifdef USE_INT
	res = rand()%0xFFFF;
#else	
	res.age = rand()%100+1;
	char ss[len+1];
	for(i=0; i<len; i++)
		res.name[i] = alpha[ rand()%alphaLen ];
	res.name[len] = '\0';
#endif
	return res;
}

int main(int argc, char **argv)
{
	int i=0, n=0;
	
	srand( time(NULL) );

	//for( ; ; )
	{
		n = rand()%30 + 1;
		for(i=0; i<n; i++)
		{
			src[i] = t_rand_num();
		}
	
		t_sort(src, aim, n, t_cmp);

		printf("一共 %d 个数:\n", n);
	
		for(i=0; i<n; i++)
		{
#ifdef USE_INT
			printf("%d ", src[i]);
#else
			printf("%3d %s\n", src[i].age, src[i].name);
#endif
		}
		puts("-----------------------------"); 
		for(i=0; i<n; i++)
		{
#ifdef USE_INT
			printf("%d ", aim[i]);
#else
			printf("%3d %s\n", aim[i].age, aim[i].name);
#endif
		}
		puts("\n\n\n");	
		
	//	sleep( 1 ); 
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值