笔试之排序算法(二)
来源:互联网 发布:利达信tk832 软件 编辑:程序博客网 时间:2024/06/01 09:40
排序(二)(升序)
以下都不是基于比较的算法,它们都是线性时间复杂度
桶排序
额外条件:输入数据 Al,A2 ,.. ., AN 必须只由小于M 的正整数组成
算法思想
- 使用一个大小为 M 称为Count的数组,它被初始化为全0
- Count有M个元素,即M个桶,且桶初始化为空
- 当读入Ai时,Count[i]加1
- 在所有的输入数据读入后,扫描数组Count,打印出排序后的表
性能分析
算法用时O(M+N),即O(N)
计数排序
算法思想
对每一个输入元素x,确定出小于x的元素个数,有了这一信息,就可以把x直接放在它在最终输出数组的位置上
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
代码和图示
性能分析
当输入的元素是n个0到k之间的整数时,它的运行时间是 O(n + k)
基数排序
算法思想
将待排数据中的每组关键字依次进行桶分配
基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:
- (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
- (2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)
例子和代码
性能分析
基数排序的性能比桶排序要略差。
- 每一次关键字的桶分配都需要O(N)的时间复杂度,而且分配之后得到新的关键字序列又需要O(N)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是O(d*2N),当然d要远远小于N,因此基本上还是线性级别的。
- 基数排序的空间复杂度为O(N+M),其中M为桶的数量。一般来说N>>M,因此额外空间需要大概N个左右。
特点
为稳定排序算法
参考资料:计数排序、桶排序和基数排序
- 笔试之排序算法(二)
- 算法笔试面试高频题之二-(排序算法)
- 笔试之排序算法(一)
- 算法之排序(二)
- 排序算法(二)之堆排序
- 排序算法之选择排序(二)
- 算法之 排序算法 (二) Java
- 笔试题二:冒泡排序算法实现
- 算法导论排序算法之选择排序(二)
- 笔试题汇集之排序算法(C/C++)
- 【基础算法】排序-简单排序之二(选择排序)
- 【基础算法】排序-复杂排序之二(快速排序)
- 八大排序算法之(二)插入排序 希尔排序
- 【上机笔试之二】冒泡排序
- 经典排序算法之实现(二)
- 算法篇之排序(二)
- 数据结构之排序算法(二)
- 基础算法(二)---数据结构之排序
- Pandas GroupBy对象 索引与迭代
- C/C++时间函数time/localtime/mktime/ctime/strftime使用方法
- Java常量的应用
- 006--swift基础语法(switch、for循环、for反序遍历)
- 通讯录1.5
- 笔试之排序算法(二)
- redis学习网站
- 小米手环iOS开发实战(一):iOS蓝牙框架CoreBluetooth
- arcgis engine toolbarcontrol 中add data item功能实现
- Android Tab 切换比较好的例子
- 工作中常用到的单词(这是根据音标自己译过来的,会读就行,没必要较真,是吧--)实时更新
- java内存分配详解
- simplexml_load_string()返回的对象属性值获取问题
- Scala详细环境安装与配置