qsort()函数和sort()函数

之前ACM的题目里面有用到qsort()函数和sort()函数,就在网上查找了一些资料。

1.qsort()函数
使用qsort()排序并用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
qsort 的函数原型是void __cdecl qsort (void *base, size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))
其中base是排序的一个集合 数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
比如:对一个长为1000的 数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int),comp);
其中comp函数应写为:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
上面是由小到大排序,return *(int *)b-*(int *)a; 为由大到小排序。
是对一个 二维数组的进行排序:
int a[1000][2]; 其中按照a[0]的大小进行一个整体的排序,其中a[1]必须和a[0]一起移动交换。
qsort(a,1000,sizeof(int)*2,comp);
int comp(const void *a,const void *b)
{
return ((int *)a)[0]-((int *)b)[0];
}

2.

STL 中 sort 函数用法简介

做 ACM 题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。 STL 里面有个 sort 函数,可以直接对数组排序,复杂度为n*log2(n) 。

使用这个函数,需要包含头文件#include

这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b) 。简单来说,有一个数组 int a[100] ,要对从 a[0] 到 a[99] 的元素进行排序,只要写 sort(a,a+100) 就行了,默认的排序方式是升序。

拿我出的“ AC 的策略”这题来说,需要对数组 t 的第 0 到 len-1 的元素排序,就写 sort(t,t+len);

对向量 v 排序也差不多, sort(v.begin(),v.end());

排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string 。

如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是 bool 型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数 cmp

bool cmp(int a,int b)

{

return a>b;

}

排序的时候就写 sort(a,a+100,cmp);


了解了这些之后,我就运用了这个函数

int compare (const void * a, const void * b) 

 return ( *(int*)a - *(int*)b );
}


 qsort (a, n, sizeof(int), compare);


然后就可以排序了。(第五次测试里的最后一题)


你可能感兴趣的:(ACM测试)