C++排序函数sort(),qsort()的⽤法C库函数qsort,C++库函数sort。其中qsort相对较慢,sort实现⾮常⾼效
qsort:
功能:使⽤例程进⾏排序
头⽂件:#include<qsort>
⽤法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数: 1 待排序⾸地址
2 数组中待排序元素数量
3 各元素的占⽤空间⼤⼩
4 指向函数的,⽤于确定排序的顺序
C++  qsort函数
头⽂件:#include <algorithm>
默认的sort函数是按升序排。
所以⾃⼰总结了⼀下,⾸先看sort函数见下表:
sort对给定区间所有元素进⾏排序
stable_sort对给定区间所有元素进⾏稳定排序
partial_sort对给定区间所有元素部分排序
partial_sort_copy对给定区间复制并排序
nth_element出给定区间的某个位置对应的元素
is_sorted判断⼀个区间是否已经排好序
partition使得符合某个条件的元素放在前⾯
stable_partition相对稳定的使得符合某个条件的元素放在前⾯
要使⽤此函数只需⽤#include <algorithm> 即可使⽤sort,语法描述为:
sort(begin,end),表⽰⼀个范围,例如:
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
输出结果将是把数组a按升序排序,说到这⾥可能就有⼈会问怎么样⽤它降序排列呢?这就是下⼀个讨论的内容.
⼀种是⾃⼰编写⼀个⽐较函数来实现,接着调⽤三个参数的sort:sort(begin,end,compare)就成了。对于list容器,这个⽅法也适⽤,把compare作为sort的参数就可以了,即:sort(compare).
sort(数组名,数组末地址,compare)    //若不写compare则默认升序排列
关于参数compare,compare带两个同类型的参数,如果第⼀个参数排在第⼆个参数前⾯,返回true,否则返回false
1)⾃⼰编写compare函数:
bool compare(int a,int b)
{
return a<b;  //升序排列,如果改为return a>b,则为降序
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,compare);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
2)更进⼀步,让这种操作更加能适应变化。也就是说,能给⽐较函数⼀个参数,⽤来指⽰是按升序还是按降序排,这回轮到函数对象出场了。
为了描述⽅便,我先定义⼀个枚举类型EnumComp⽤来表⽰升序和降序。很简单:
enum Enumcomp{ASC,DESC};
然后开始⽤⼀个类来描述这个函数对象。它会根据它的参数来决定是采⽤“<”还是“>”。
class compare
{
private:
Enumcomp comp;
public:
compare(Enumcomp c):comp(c) {};
bool operator () (int num1,int num2)
{
switch(comp)
{
case ASC:
return num1<num2;
case DESC:
return num1>num2;
}
}
};
接下来使⽤ sort(begin,end,compare(ASC)实现升序,sort(begin,end,compare(DESC)实现降序。
主函数为:
int main()
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,compare(DESC));sort函数 js
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
3)其实对于这么简单的任务(类型⽀持“<”、“>”等⽐较运算符),完全没必要⾃⼰写⼀个类出来。标准
库⾥已经有现成的了,就在functional ⾥,include进来就⾏了。functional提供了⼀堆基于模板的⽐较函数对象。它们是(看名字就知道意思了):equal_to<Type>、
not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就⾜够了,直接拿过来⽤:
升序:sort(begin,end,less<data-type>());
降序:sort(begin,end,greater<data-type>()).
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,greater<int>());
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
4)既然有迭代器,如果是string 就可以使⽤反向迭代器来完成逆序排列,程序如下:
int main()
{
string str("cvicses");
string s(str.rbegin(),d());
cout << s <<endl;
return 0;
}
STL容器的排序,⽀持随机访问的容器vector,deque,string没有sort成员,可调⽤std::sort排序;list排序调⽤⾃带的list::sort。
下⾯是std::sort函数,有两个版本:
sort函数有以下特征:
1. 要求输⼊⼀个范围[first, last)
2. 随机迭代器,能⽤此算法的容器是⽀持随机访问的容器:vector, deque, string。
3.第⼀个版本使⽤operator<;进⾏⽐较,默认升序排序,第⼆个版本使⽤comp做⽐较.
关于参数comp,comp带两个同类型的参数,如果第⼀个参数排在第⼆个参数前⾯,返回true,否则返回false
它可以是函数指针,也可以是函数对象。函数指针好理解,何谓函数对象?
函数对象(Function Object),是重载了operator()函数的类(或结构体)实例化出来的对象,使⽤起来像函数,⼜叫仿函数。
STL 本⾝提供了⼏个⽐较函数,下⾯这些都是仿函数:
less(⼩于)
greater(⼤于)
equal_to(等于)
not_equal_to(不相等)
less_equal(⼩于等于)
greater_equal(⼤于等于)
当容器元素为内建类型时可以使⽤,注意使⽤的格式,要加模版参数(由于是模板类)和后⾯的(),如下:
对于复合类型,实现排序⽅式有3种⽅法:
1)  重载operator<;操作符
2)  写全局的⽐较函数
3)  写仿函数,重载operator()形式为:bool operator()(const 类名& 参数){…}
下⾯看看这3种⽅法的实现:
⽤函数对象代替函数指针的优点:
1. 函数对象可以存储中间结果在数据成员中,⽽函数想要存中间结果须要设全局变量或静态变量,这个是我们不想要的。
2.
在函数对象中编译器可以实现内联调⽤,从⽽提升性能。
下⾯看⼀个函数对象的扩展应⽤
注意:如果是指针的容器,⽐较函数的参数也应是指针。
C++sort()函数的⽤法
近来看了c++标准库这本书,学到了很多,就把这其中的⼀点C++sort()函数的⽤法写下来和⼤家分享!
吧!
(⼀)为什么要⽤c++标准库⾥的排序函数
Sort()函数是c++⼀种排序⽅法之⼀,学会了这种⽅法也打消我学习c++以来使⽤的冒泡排序和选择排序所带来的执⾏效率不⾼的问题!因为它使⽤的排序⽅法是类似于快排的⽅法,时间复杂度为n*log2(n),执⾏效率较⾼!
(⼆)c++标准库⾥的排序函数的使⽤⽅法
I)Sort函数包含在头⽂件为#include<algorithm>的c++标准库中,调⽤标准库⾥的排序⽅法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!
II)Sort函数有三个参数:
(1)第⼀个是要排序的数组的起始地址。
(2)第⼆个是结束的地址(最后⼀位要排序的地址)
(3)第三个参数是排序的⽅法,可以是从⼤到⼩也可是从⼩到⼤,还可以不写第三个参数,此时默认的排序⽅法是从⼩到⼤排序。
Sort函数使⽤模板:
Sort(start,end,排序⽅法)
下⾯就具体使⽤sort()函数结合对数组⾥的⼗个数进⾏排序做⼀个说明!
例⼀:sort函数没有第三个参数,实现的是从⼩到⼤
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10);
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
例⼆
通过上⾯的例⼦,会产⽣疑问:要实现从⼤到⼩的排序肿么办?
这就如前⽂所说需要在sort()函数⾥的第三个参数⾥做⽂章了,告诉程序我要从⼤到⼩排序!
需要加⼊⼀个⽐较函数 complare(),此函数的实现过程是这样的
bool complare(int a,int b)
{
return a>b;
}
这就是告诉程序要实现从⼤到⼩的排序的⽅法!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。