常用查询库 qsort和sort

来源:互联网 发布:mysql count 编辑:程序博客网 时间:2024/06/14 00:55

  • qsort
    • 对double类型数组排序特别注意
    • 结构体排序
  • sort
  • 区别

qsort

基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定

qsort位于头文件 <cstdlib>
qsort 的函数原型是
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针

compare这个比较函数(可以随便写成什么)。
典型的compare的定义是int compare(const void *a,const void *b);
返回值必须是int,两个参数的类型必须都是const void *。
const void *a这是定义了一个指针a,a可以指向任意类型的值。之后需要类型转换方可使用。
假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,以此还可以定义降序。涉及到结构体/类的时候还可以根据需要针对特定的内容进行排序。

| Compare 函数的返回值 | 描述 |
|< 0|elem1将被排在elem2前面|
|0|elem1 等于 elem2|
|> 0|elem1 将被排在elem2后面|

Compare 函数的返回值 描述 < 0 elem1将被排在elem2前面 0 elem1 等于 elem2,相邻 > 0 elem1 将被排在elem2后面

对double类型数组排序(特别注意)

double in[100];
int cmp( const void *a , const void *b )
{
return (double )a > (double )b ? 1 : -1;
}
返回值的问题,cmp返回的是一个整型,若不自行赋值1或-1则有可能因为精度损失而变成0,这就导致了错误

结构体排序

直接以多级排序为例,单级排序则更为简单
按照x从小到大排序,当x相等时按y从大到小排序

struct Node{    int x;    int y;};int Comp(const void*p1,const void*p2){    struct Node*c=(Node*)p1;    struct Node*d=(Node*)p2;    if(c->x!=d->x)        return c->x-d->x;    else         return d->y-c->y;}

sort

qsort位于头文件 <algorithm> 此外需要命名空间std
函数原型有两个:

1.
template< class RandomIt >

2.
emplate< class RandomIt, class Compare >
  void sort( RandomIt first, RandomIt last, Compare comp );

last并非所需排列数组的最后一个元素,而是first+元素个数(结尾元素的下一个元素的地址)
此外,第三个参数(比较函数)可以省略,则默认情况下按照从小到大的顺序排序。这就要求进行排序的类型定义了 “<” 运算符。
若是需要实现降序或者根据其他需求进行排序则按照qsort中类似的方法写比较函数。但是函数原型有所不同了:
bool cmp(const Type1 &a, const Type2 &b);

区别

std::sort是一个改进版的qsort. std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。
sort是qsort的升级版,尽量用sort,也比较简单。若是默认需要升序直接使用sort即可

原创粉丝点击