常用排序之qsort和sort

本文对算法竞赛中常用到的两个排序函数qsort和sort的使用方法做出一些总结,重点关注它们使用时排序规则的定义。


1、qsort

函数原型:

void __cdecl qsort (  
    void *base,  
    size_t num,  
    size_t width,  
    int (__cdecl *comp)(const void *, const void *)  
    )

函数包含在头文件中,参数解释如下:
base: 排序起始地址
num: 排序元素数量
width: 单个元素大小
comp; 排序规则,用来比较两个元素大小的函数指针


下面讨论排序规则comp函数的写法,常写成cmp,默认升序排列:

一、对int类型排序

int num[MaxSize];

int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}

qsort(num, n, sizeof(num[0]), cmp);

二、对double类型排序

double num[100];

int cmp(const void *a, const void *b)
{
	return *(double *)a > *(double *)b ? 1 : -1;//这里注意,浮点数是不能用等号来判断相等的
}

qsort(num, n, sizeof(num[0]), cmp);

三、对char类型排序

char num[100];

int cmp(const void *a, const void *b)
{
	return *(char *)a - *(char *)b;
}

qsort(num, n, sizeof(num[0]), cmp);

四、对结构体一级排序

struct Node
{
	int x;
	int y;
}num[100];

int cmp(const void *a, const void *b)//按x排序
{
	struct Node *c = (Node *)a;
	struct Node *d = (Node *)b;
	return c->x - d->x;
}

qsort(num, n, sizeof(num[0]), cmp);

五、对结构体二级排序

struct Node
{
	int x;
	int y;
}num[100];

int cmp(const void *a, const void *b)//按x排序,x相等时按y排序
{
	struct Node *c = (Node *)a;
	struct Node *d = (Node *)b;
	if (c->x != d->x)
		return c->x - d->x;
	return c->y - d->y;
}

qsort(num, n, sizeof(num[0]), cmp);

六、对结构体数组排序(按照结构体中str的字典序排序)

struct Array
{
	char str[100];
}num[100];

int cmp(const void *a, const void *b)
{
	struct Array *c = (Node *)a;
	struct Array *d = (Node *)b;
	return strcmp(c->str, d->str);
}

qsort(num, n, sizeof(num[0]), cmp);


2、sort

函数原型:

template 
 void sort ( RandomAccessIterator first, RandomAccessIterator last );

template 
 void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

函数包含在头文件中,可以看出,sort函数可以传递两个或三个参数,第一个参数为排序的起始地址,第二个参数为排序的终止地址,第三个参数为排序规则:

一、传递两个参数,默认升序排序

//对数组num的前n个元素排序
int num[MaxSize];

sort(num, num+n);//这里是num+n,也就是对num[0]到num[n-1]排序

二、有时候需要降序排序,这时候需要定义排序规则,作为第三个参数,同样用cmp来表示

bool cmp(int a, int b)
{
	return a > b;
}

//对数组num的前n个元素降序排序
int num[MaxSize];

sort(num, num+n, cmp);

一般情况下,如果能够使用sort解决问题,总是会优先使用sort函数,因为它用起来更简单。



你可能感兴趣的:([ACM],[ACM]_排序)