| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 《算法学习》学习(十)----计数排序,基数排序,桶排序(C语言) -> 正文阅读 |
|
[数据结构与算法]《算法学习》学习(十)----计数排序,基数排序,桶排序(C语言) |
系列文章《算法导论》学习(一)---- 插入排序和归并排序 文章目录前言本文主要讲解了三大线性时间排序: 一、线性时间排序1.什么是比较排序?比较算法有一个性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较
2.为什么比较排序不能是线性时间排序?在前面的文章我们证明了如下的结论: 对包含n个元素的输入序列来说,任何比较排序在最坏情况下都要经过 Ω ( n l g n ) \Omega(nlgn) Ω(nlgn)次比较 因此比较排序算法不可能是线性时间排序算法 3.线性时间排序算法比如有:
这些算法它们都不是比较排序算法,它们得到正确的顺序不是通过比较,而是通过计算来进行的。 都采用了空间换时间的算法理念 二、计数排序1.C语言代码
2.算法逻辑(1)前提假设假设n个输入元素中的每一个元素都是在0到k区间内的一个整数,其中k也是一个整数。 (2)基本思想1.对于每一个输入元素x,确定小于等于x的个数n。利用信息n,就可以将x放到输出有序数组B上面,即B[n]=x。 2.那么让输入无序数组A中的每一个元素经历上述过程,就可以得到完整的输出有序数组B 3.对于输入无序数组A中有多个同一元素的情况,用如下解决方案:
(3)算法特点算法本身具有稳定性: 输入数组A和输出数组B中,相同元素的先后次序不变,比如说: A中有一段是“8,8,8”,我们给它们编号“ 8 1 , 8 2 , 8 3 8_1,8_2,8_3 81?,82?,83?”,那么B输出时也是:“ 8 1 , 8 2 , 8 3 8_1,8_2,8_3 81?,82?,83?” 3.算法时间性能分析
当
k
=
O
(
n
)
,
n
为输入规模时,算法的运行时间为
T
(
n
)
=
Θ
(
n
)
。
当k=O(n),n为输入规模时,算法的运行时间为T(n)=\Theta(n)。
当k=O(n),n为输入规模时,算法的运行时间为T(n)=Θ(n)。 三、基数排序1.C语言代码
2.算法逻辑(1)前提假设假设n个输入元素中的每一个元素都是不超过k位的一个整数,其中k也是一个整数。 (2)基本思想1.对于一组输入无序数组A,它的所有元素最大为k位 2.那么从最低位开始往最高位循环,每一次循环根据A中这些数该位上0~9的数字排序 3.每一次排序都用计数排序,计数排序的k值为9 4.每排序一个位上的数据,就依此来改变整体数据的位次 3.算法时间性能分析当输入数组为:n个d位数,其中每一个数位有k个可能的取值,那么当: 四、桶排序1.C语言代码注意:
2.算法逻辑(1)假设前提输入数据的情况服从均匀分布 (2)基本思想1.将数据同过除以某一个数,使得所有数据落入[0,1),这些数据均匀分布在其上 2.如果有n个数据输入,那么申请n个链表L(n),称为n个桶 3.将落入[0,1)中的数据x,让i=n*x(向下取整),然后让原数据a插入链表L(i) 4.然后对每一个链表L(i),进行排序 5.然后将n个链表中的数据,依次输出到数组 (3)算法特点将n个数据均匀分到n个链表中,那么如果数据是均匀的话,每一个链表中的数据是极小的 那么对于每一个链表的排序规模较小,时间代价是常数 3.算法时间性能分析算法的时间分析涉及复杂的概率分析,这里不做具体分析 那么结论是: 五、线性时间排序一定好吗?1.时间角度线性时间排序的循环次数比比较时间排序少,但是每一次循环花费时间更多 2.空间角度线性时间排序运用了空间换时间的思路,需要大量的额外空间来减少循环次数 3.结论1.如果内存足够,输入数据又满足相应的特点,那么可以采用线性时间排序 2.如果内存比较珍贵,那么各方面性能都好的快速排序是很好的选择 总结本文的不妥之处,请各位读者包容和指正。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:41:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |