当前位置:  编程技术>c/c++/嵌入式

C++线性时间的排序算法分析

    来源: 互联网  发布时间:2014-10-27

    本文导语:  前面的文章已经介绍了几种排序算法,如插入排序(直接插入排序,折半插入排序,希尔排序)、交换排序(冒泡排序,快速排序)、选择排序(简单选择排序,堆排序)、2-路归并排序(可以参考前一篇文章:各种内部排序...

前面的文章已经介绍了几种排序算法,如插入排序(直接插入排序,折半插入排序,希尔排序)、交换排序(冒泡排序,快速排序)、选择排序(简单选择排序,堆排序)、2-路归并排序(可以参考前一篇文章:各种内部排序算法的实现)等,这些排序算法都有一个共同的特点,就是基于比较。

本文将介绍三种非比较的排序算法:计数排序,基数排序,桶排序。它们将突破比较排序的Ω(nlgn)下界,以线性时间运行。

一、比较排序算法的时间下界

所谓的比较排序是指通过比较来决定元素间的相对次序。

“定理:对于含n个元素的一个输入序列,任何比较排序算法在最坏情况下,都需要做Ω(nlgn)次比较。”
也就是说,比较排序算法的运行速度不会快于nlgn,这就是基于比较的排序算法的时间下界。

通过决策树(Decision-Tree)可以证明这个定理,关于决策树的定义以及证明过程在这里就不赘述了。读者可以自己去查找资料,这里推荐大家看一看麻省理工学院公开课:算法导论的《MIT公开课:线性时间排序》

根据上面的定理,我们知道任何比较排序算法的运行时间不会快于nlgn。那么我们是否可以突破这个限制呢?当然可以,接下来我们将介绍三种线性时间的排序算法,它们都不是通过比较来排序的,因此,下界Ω(nlgn)对它们不适用。

二、计数排序(Counting Sort)

计数排序的基本思想就是对每一个输入元素x,确定小于x的元素的个数,这样就可以把x直接放在它在最终输出数组的位置上,例如:

 

算法的步骤大致如下:

①.找出待排序的数组中最大和最小的元素

②.统计数组中每个值为i的元素出现的次数,存入数组C的第i项

③.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

④.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

C++代码如下:

/************************************************************************* 
  > File Name: CountingSort.cpp 
  > Author: SongLee 
 ************************************************************************/ 
#include 
using namespace std; 
 
/* 
 *计数排序:A和B为待排和目标数组,k为数组中最大值,len为数组长度 
 */ 
void CountingSort(int A[], int B[], int k, int len) 
{ 
  int C[k+1]; 
  for(int i=0; inext = ist; 
    } 
  } 
 
  for(int i=0; ivalue; 
      p = p->next; 
    } 
  } 
} 
 
/* 输出数组 */ 
void print(int A[], int len) 
{ 
  for(int i=0; i

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • GNU线性编程工具 GLPK
  • 非线性拟合和数据分析工具 Fityk
  • 非线性视频编辑软件 Cinelerra
  • linux0.11内核线性地址问题,请教!!
  • 多媒本线性剪辑软件 VirtualDubMod
  • 线性代数等数学模型库 ojAlgo
  • Java线性代数库 jblas
  • 线性代数Java包 JAMA
  • 这句话什么意思:“分页存储管理是一个单一的线性地址空间,分段存储管理的作业地址空间是二维的。”?
  • Linux下的非线性编辑器有哪些比较专业????
  • 为什么进程的线性地址空间需要分配
  • 进程,线性地址(虚拟地址),kernel之间的关系
  • 《操作系统原理linux篇》逻辑地址,线性地址 物理地址
  • GDTR和LDTR中放置的是物理地址还是线性地址?
  • 关于LINUX运行时线性空间及物理内存存储的分布问题
  • Linux内存线性地址空间布局解析---的一些疑惑,大家帮忙解释解释
  • java实现顺序结构线性列表的函数代码
  • 逻辑地址、物理地址、线性空间、全局段、局部段 问题请教,高手指教了!!!!在线等,高手指教了!!!在线等!!!!!!!!
  • java线性表排序示例分享
  • C语言线性表的顺序表示与实现实例详解




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3