当并算法具体解释请见点我

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~
所以自己总结了一下,首先看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).

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用来表示升序和降序。非常easy:
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));
  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(),str.rend());
  cout << s <<endl;
  return 0;
}
qsort():
原型:
_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));
解释: qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比較函数)
比較函数是一个自己写的函数 遵循 int com(const void *a,const void *b) 的格式。
当a b关系为 > < = 时,分别返回正值 负值 零 (或者相反)。
使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。
数组下标从零開始,个数为N, 下标0-(n-1)。
实例:
int compare(const void *a,const void *b)
{
  return *(int*)b-*(int*)a;  
}
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;
  qsort((void *)a,20,sizeof(int),compare);
  for(i=0;i<20;i++)
  cout<<a[i]<<endl;
  return 0;
}
相关:
1)why你必须给予元素个数?
由于阵列不知道它自己有多少个元素
2)why你必须给予大小?
由于 qsort 不知道它要排序的单位.
3)why你必须写那个丑陋的、用来比較俩数值的函式?
由于 qsort 须要一个指标指向某个函式,由于它不知道它所要排序的元素型别.
4)why qsort 所使用的比較函式接受的是 const void* 引数而不是 char* 引数?
由于 qsort 能够对非字串的数值排序.
当然对于排序函数还有其它的使用方法,今天就仅仅说这些,我也正在学习中,上述仅仅是发表了一点自己的拙见,最后声明上诉实例是基于VC++2008。

二维字符数组排序

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;struct Data
{char data[100];
}str[100];bool cmp(const Data &elem1, const Data &elem2)
{if (strcmp(elem1.data, elem2.data) < 0)return true;return false;
}int main()
{int n, i;while (cin>>n){for (i=0; i<n; ++i){cin>>str[i].data;}sort(str, str+n, cmp);for (i=0; i<n; ++i)cout<<str[i].data<<endl;}return 0;
}

代码二:

bool cmp(const char *elem1, const char *elem2)
{if (strcmp(elem1, elem2) < 0)return true;return false;
}int main()
{char str[100][100];char *pStr[100] = {NULL};int n, i;while (cin>>n){for (i=0; i<n; ++i){cin>>str[i]; pStr[i] = str[i];}sort(pStr, pStr+n, cmp);for (i=0; i<n; ++i)cout<<pStr[i]<<endl;}return 0;
}

qsort()

#include <iostream>
#include <algorithm>
using namespace std;
int cmp(const void *a,const void *b){return strcmp((char*)a,(char *)b);
}struct tel{char phone[10];
}tel[10];
int main(){int cases;int i;cin >> cases;char tel[20][10];for(i = 0; i < cases; ++i)cin >> tel[i];qsort(tel,cases,sizeof(char)*10,cmp);for(int j = 0; j < i; ++j)cout << tel[j] << endl;
}

转载于:https://www.cnblogs.com/zfyouxi/p/4231680.html

c++中sort()及qsort()的使用方法总结相关推荐

  1. linux 字符串转数字排序,linux中sort命令排序功能实现方法

    功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...

  2. python sort函数返回值_python中 sort方法 和sorted函数

    sort和sorted在python中常用语列表(或类列表)的排序,但是在python中有所区别. 他们的唯一的共同点恐怕就是都可以对列表排序,区别: 1. sorted是python的内置函数,可以 ...

  3. python中的sort排序加换行_python中sort()排序的方法

    python中sort()排序的方法 发布时间:2020-09-01 10:57:52 来源:亿速云 阅读:110 作者:小新 这篇文章主要介绍了python中sort()排序的方法,具有一定借鉴价值 ...

  4. C++中SORT函数使用方法

    C++中SORT函数使用方法 一.sort函数 1.sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑! ...

  5. php之sort,php中sort函数的使用方法

    php中sort函数的使用方法 发布时间:2020-09-08 10:44:27 来源:亿速云 阅读:99 作者:小新 小编给大家分享一下php中sort函数的使用方法,相信大部分人都还不怎么了解,因 ...

  6. JS中sort方法排序

    JS中sort方法排序 一.数字排序(string类型) 二.数字排序(string类型和number类型) 三.混合排序(string.number和字母) 四.函数排序 五.数组对象排序 一.数字 ...

  7. html中的sort方法,JavaScript_javascript中sort() 方法使用详解,语法:arrayObject.sort(sortby);参 - phpStudy...

    javascript中sort() 方法使用详解 语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函数. sort() 方法用于对数组的元素进行排序. ...

  8. 【python常见面试题】之python 中对list去重的多种方法

    在python相关职位的面试过程中,会对列表list的去重进行考察.(注意有时会要求保证去重的顺序性) 1.直观方法 1 li=[1,2,3,4,5,1,2,3] 2 new_li=[] 3 for ...

  9. Linux中sort,uniq,cut,wc命令详解

    Linux中sort,uniq,cut,wc命令详解 来源:hellodev 本文主要对Linux中sort,uniq,cut,wc这4个命令的使用方法进行了详细说明,希望对你有所帮助. sort s ...

  10. 在linux中的sort命令,linux中sort命令

    功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...

最新文章

  1. docker加速器,设置cdn
  2. 使用Formik轻松开发更高质量的React表单(二)使用指南
  3. 0603贴片电阻阻值对照表_怎样读贴片电阻阻值
  4. 20200428总结
  5. 计算机视觉:基于眼疾分类数据集iChallenge-PM图像分类经典模型剖析(LeNet,AlexNet,VGG,GoogLeNet,ResNet)
  6. Node.js项目目录介绍
  7. Git之工作区和暂存区
  8. 智慧交通day01-算法库01:numba
  9. Excel 宏工作簿 VBAProject 工程保护 - 代码不可查看
  10. python实现猜数字小游戏
  11. SpringSecurity入门到入土教程_2 Oauth教程
  12. go 调用mysql存储过程_带输出参数的mysql存储过程并发调用问题
  13. macos蓝牙驱动和wifi驱动名称_win7蓝牙装不上?别急着捣鼓驱动软件啦!可能是硬件问题!...
  14. 开热点给电脑消耗大吗_电脑连热点流量消耗大吗
  15. CLion 的 Debug 模式是怎么回事
  16. JSR 354为Java引入金钱与货币的完美支持
  17. Unix Linux、MAC、Window 如何安装配置环境?都在这里啦~
  18. “视而不见”—有关不注意视盲现象的研究
  19. 微信小程序 之 原生开发
  20. Verilog学习之数据大小端转换设计

热门文章

  1. redis 分布式锁 看门狗_为什么redis可以做分布式锁
  2. nginx启动vue_nginx下部署vue项目的方法步骤
  3. android音乐播放功能,Android开发中如何实现一个音乐播放器功能
  4. DL_C2_week1_2(Regularization)L2,Drop_out正则化
  5. 机器学习- 吴恩达Andrew Ng Week7 知识总结Support Vector Machines
  6. WWDC2019: SwiftUI实现你的第一个App
  7. SwiftUI实战一:从入门到精通
  8. Momentum动量法
  9. 二叉搜索树的第K大结点
  10. 凸优化第七章统计估计 7.1参数分布估计