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

现在对sort()和qsort()的一些用法做下介绍,但讲的都并不完整,只是把比赛时常用的一些内容罗列出来。

sort函数:其实sort()并不能叫做快速排序,而应该说成智能排序;它正常情况下,会使用快排,但是发现快排恶化的话,会自动调整成其他排序来辅助。是最高效的排序。在C++的algorithm库中。

sort(begin,end);
/*在[begin, end]中的元素进行排序按升序排列
sort()默认是按升序排序,如果要按降序排序,还需自己编写一个比较函数来实现 */

eg.  :

int _main()
{
int a[20],i;
for(i=0;i<20;i++)
cin>>a[i];
sort(a,a+20); //按升序排序
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}

这里的排序是升序的,那如果要降序的该怎么办呢?下面给出自己编写比较函数来实现的代码:

int cmp(int a,int b)
{
return a<b; //升序排列;改为return a>b,则为降序 } int main()
{
int a[20],i;
for(i=0;i<20;i++)
cin>>a[i];
sort(a,a+20,cmp);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}

  其实只是为了实现对整型和实型数组的升序、降序排序,可以有更简单的方法,无需自己再编函数,因为标准库里有现成的了,它提供了好些基于模板的比较函数对象,可以直接用的了;这里要用到的是greater<data_type>和less<data_type>。

  • 升序:sort(begin,end,less<data-type>());
  • 降序:sort(begin,end,greater<data-type>());
int main()
{
int a[20],i;
for(i=0;i<20;i++)
cin>>a[i];
sort(a,a+20,less<int>());//如果要按降序,就改为greater<int>()
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}

  下面是qsort():

qsort(quicksort)根据你给的比较函数给一个数组快速排序,是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。

qsort和compare的用法如下:

void qsort( void *base, size_len, size_data, int compare);

int compare (const void *elem1, const void *elem2 ) ;

compare函数:

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

 {
return *(int *)a - *(int *)b; //升序排序 //return *(int *)b - *(int *)a; //降序排序 }

上面是对Int型的排序,如果是字符型,就把int换为char。而double型的为下:

 int cmp(const void*a,const void*b)
{
return *(double*)a>*(double*)b?:-;//升序 //return *(double*)b>*(double*)a?1:-1; 降序
}

最新文章

  1. 面向移动设备的html5开发框架
  2. X3DOM新增剪裁平面节点ClipPlane支持
  3. 【转】仿百度输入框智能提示的js代码
  4. codeforces C. Arithmetic Progression 解题报告
  5. hashMap底层put和get方法逻辑
  6. 在Yii用createUrl中明明白白生成网址
  7. Zabbix全方位告警接入-电话/微信/短信都支持
  8. 1.Getting Started
  9. Eclipse关闭检查
  10. 5、手把手教你Extjs5(五)使用图标字体来美化按钮)
  11. CSS实现的几款不错的菜单栏
  12. C# bool.tryparse
  13. [转,讲的非常精彩]CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
  14. spring的ioc与aop原理
  15. IOS返回go(-1)
  16. IntelliJ IDEA配置Tomcat 与安装Tomcat失败原因
  17. SpringMVC配置文件详解
  18. jsonConfig使用方法
  19. 超简单的制作win7 U盘启动
  20. 使用Hystrix进行微服务降级管理

热门文章

  1. lodop多打印一页白纸
  2. [Apple开发者帐户帮助]五、管理标识符(2)启用应用服务
  3. selenium3 + python - css定位
  4. Django day17 博客项目(一)
  5. angular的directive指令的link方法
  6. HTML基础练习
  7. Spring Boot (15) pom.xml设置
  8. Java 精度控制
  9. [hihocoder][Offer收割]编程练习赛50
  10. 【MySQL】源码安装