sort与qsort的异同

主要内容:

1、qsort的用法

2、sort的用法

3、qsort和sort的区别

qsort的用法:

 : void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

 : 使用快速排序例程进行排序

参 数:

1 待排序数组首地址

2 数组中待排序元素数量

3 各元素的占用空间大小

4 指向函数的指针,用于确定排序的顺序

 明:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。

qsort要求提供的函数是需要自己定义的一个比较函数,比较函数使得qsort通用性更好。有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
如int cmp(const void *a, const void *b)中有两个元素作为参数(参数的格式不能变的。)返回一个int值,如果比较函数返回大于0,qsort就认为a > b,返回小于0,qsort就认为a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比较函数返回本来应该是1的(即a > b),而却返回-1(小于0的数),那么qsort认为a < b,就把b放在前面去,但实际上是a > b的,所以就造成了降序排序的差别了。简单来说,比较函数的作用就是给qsort指明元素的大小事怎么比较的。

qsort中几种常见的cmp函数:

一、对int类型数组排序 
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型) 
char word[100];
int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
}

qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序(特别要注意) 
double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
//返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失。
qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序 
struct In
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写 
int cmp( const void *a ,const void *b)
{
return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1;
}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

struct In
{
int x;
int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序 
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}

qsort(s,100,sizeof(s[0]),cmp);

sort的用法:

MSDN中的定义:

template<class RanIt>
void sort(RanIt first, RanIt last); //--> 1)
template<class RanIt, class Pred>
void sort(RanIt first, RanIt last, Pred pr); //--> 2)

头文件:
#include <algorithm>
using namespace std;

说明:sort有默认的比较函数,默认是按升序排列。

void sort(RanIt first, RanIt last, Pred pr);前两个参数为迭代器指针,分别指向容器的首尾,第三个参数为比较方法。

比较方法有三种:

1、默认(不写):对于内置类型,按照升序排列;

2、标准库自带函数:functional提供了一堆基于模板的比较函数对象:equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。升序:sort(begin,end,less<data-type>()); 降序:sort(begin,end,greater<data-type>()).

3、自定义函数:如

int cmp(const int &a,const int &b)

{

  return a>b

}

Sort中的cmp函数参数可以直接是参与比较的引用类型。

qsort与sort的区别:

std::sort是一个改进版的qsort.

std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。

1.cmp函数和qsort中cmp函数的不同

?int cmp(const int &a,const int &b)

{

  return a>b

}

Sort中的cmp函数参数可以直接是参与比较的引用类型,sort可以采用标准库自带的比较函数,而qsort没有。

2cmp函数比较时qsort用“-”,而sort用”>”.这也是一个重要的区别。

3sort函数是c++中标准模板库的的函数,在qsort()上已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。在同样的元素较多和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。使用时需调用<algorithm>
sort(begin(),end(),cmp)。

参考文章:

http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/22/2513776.html

http://www.cnblogs.com/zhangshu/archive/2011/05/20/2052359.html

http://blog.csdn.net/zzzmmmkkk/article/details/4266888/

时间: 2024-10-25 17:28:46

sort与qsort的异同的相关文章

C++中sort()及qsort() (不完整介绍)

在平时刷算法题和oj的时候,排序算法是最经常用到的算法之一:且在各类算法书的目录中 也通常是将各种排序算法放在最前面来讲,可见排序算法的重要性.可能许多人都在算法书中有学过冒泡.快速排序的方法,也都大致了解其原理:实际应用时,冒泡排序是最为简单的,当然复杂度也是最高的.....(就如高德纳所说:"冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的"):快排在理想情况下可以说是最高效的了(nlogn).但快速排序并不像冒泡排序那样好理解和记忆,每次都需

pair/sort/find/qsort

1. pair template <class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() : first(T1()), second(T2()) {} pair(const T1 & a, const T2 & b) : first(a), second(b) {} template <class U1, cl

sort与qsort的区别与联系

sort属于C++范畴,在algorithm头文件中,下面直奔主题,给大家一个清晰明了的认识.qsort有C,和C++两个版本. qsort的compare函数原型 //comp ,也就说,如果the first < the second 返回-1;如果the first > the second 返回1;如果the first == the second 返回0.,排序结果就表现为升序 comp - comparison function which returns ?a negative

c++中sort()及qsort()的用法总结

函数名 功能描述  sort 对给定区间所有元素进行排序  stable_sort 对给定区间所有元素进行稳定排序  partial_sort 对给定区间所有元素部分排序  partial_sort_copy 对给定区间复制并排序  nth_element 找出给定区间的某个位置对应的元素  is_sorted 判断一个区间是否已经排好序  partition 使得符合某个条件的元素放在前面  stable_partition 相对稳定的使得符合某个条件的元素放在前面 要使用此函数只需用#inc

(C++)STL排序函数sort和qsort的用法与区别

主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 功 能: 使用快速排序例程进行排序 参 数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 说 明:qsort函数是ANSI C标准中提供的,其

sort与qsort

1.qsort函数: 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 功 能: 使用快速排序例程进行排序 参 数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 说 明:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n). q

sort与qsort的用法,建议使用sort

做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错.STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n). 使用这个函数,需要包含头文件 #include <algorithm>. 这个函数可以传两个参数或三个参数.第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址.也就是说,排序的区间是[a,b).简单来说,有一个数组int a[100],要对从a[0]到a[

c++中sort()及qsort()的使用方法总结

当并算法具体解释请见点我 想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给定区间全部元素进行排序 stable_sort 对给定区间全部元素进行稳定排序 partial_sort 对给定区间全部元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置相应的元素 is_sorted 推断

C语言qsort和C++sort的用法小结和区别比较

第一项: qsort: (只是些概念,了解一下就可以) 基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低.集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分. 函数对buf 指向的数据按升序排序. 使用方法: void qsort( void *base, size_t num, size_t width, int (__cdecl *c