七、基于比较的排序算法总结
1 问题
至此,总结一下已经研究过的排序算法:
insertion sort,Θ(n2)\Theta(n^2)Θ(n2)
merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)
quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)
heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn)
- 从上面这个现象发现,这些算法的算法复杂度≥Θ(nlogn)\ge\Theta(nlogn)≥Θ(nlogn);
- 从算法的细节上看,算法的最基本的思想是比较元素大小;
从上面的发现中,可以提出这样一个猜想:
所有基于比较的排序算法,算法复杂度≥Θ(nlogn)\ge\Theta(nlogn)≥Θ(nlogn)。
2 证明结论
数学证明的思路分两步,1⃣️找到一种更加抽象的数学结构表达各种基于比较排序算法;2⃣️研究这种抽象的数学结构的性质;3⃣️利用得到的性质说明结论。
2.1 Decision-tree(抽象数学结构)
这个决策树和Machine Learning里的决策树本质上是一个意思。
- 先看一个简单的例子
- 三个元素的Decision-tree很容易画出,但是≥4\ge4≥4就不容易画出了,因为有Cn2C_n^2Cn2种比较,而每一次比较又有两种结果,这些比较的结果中一部分就可以决定全序…,已经超出人脑处理范畴,计算机也不太容易处理;
- 仔细品品基于比较的排序算法,也是一顿比较之后确定一个全序,而这顿比较恰恰是Decision-tree所有比较之一,也就是Decision-tree的一条路径;
- 不过我们不必过于纠结Decision-tree的细节结构,只需要知道它的存在性就足够解决我们今天的问题了,这就是数学抽象之美;
2.2 Decision-tree的数学性质
2.3 结论得证
决定基于比较的排序算法的复杂度是比较的次数,用decision tree就是某一个路径的高度hhh,现在已经证明整个二叉树的高度h≥Ω(nlogn)h\ge\Omega(nlogn)h≥Ω(nlogn),那就说明基于比较的排序算法的复杂度≥Ω(nlogn)\ge\Omega(nlogn)≥Ω(nlogn)。
3 强调重点
- 决定基于比较的排序算法的复杂度是比较的次数;
- 在input确定的情况下,某种基于比较的排序算法的比较序列和decision tree的结构可以确定,该算法的比较序列只是decision tree的某一条路径;
- 基于比较的排序算法随机化后仍符合上面的逻辑框架,结论仍然成立;
七、基于比较的排序算法总结相关推荐
- c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc
基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...
- 基于使用学习排序算法的Web服务学习的个性化的决策战略
摘要----为了从类似的服务列表中进行功能上的选择,用户往往需要根据多个QoS准则做出他们的决定,它们需要对目标服务.在这个过程中,不同的用户可能遵循不同的决策策略,有些是补偿性的,在这个补偿中在所有 ...
- 七种常见的排序算法总结
目录 引言 1.什么是排序? 2.排序算法的目的是什么? 3.常见的排序算法有哪些? 一,插入排序 1.基本思想 2.代码实现 3.性能分析 4.测试 二,希尔排序(缩小增量排序) 1.基本思想 2. ...
- C语言实现基于查找和排序算法的学生成绩分析
1.编写程序将自己学号后面的8位同学的学号.姓名以及数学.英语和数据结构的成绩信息保存到学生成绩表中.如果学号后面没有8位同学,就用学号在班级最前面的学生依次补齐,例如学号为189000248号张二同 ...
- 算法:基于比较的排序算法
1.冒泡排序: (1)平均时间复杂度:O(n2) (2)最好时间复杂度:O(n) (3)最坏时间复杂度:O(n2) (5)空间复杂度:O(1) (5)稳定性:稳定 (6)JavaScript实现: f ...
- 基于比较的排序算法集
#include <iostream> using namespace std;#define SWAP(i,j) {int t=(i);(i)=(j);(j)=t;}//插入排序 voi ...
- 【数据结构】万字解析!如何用Java实现七种常见的排序算法!
目录 1.直接插入排序 思路: 代码以及解析 2.希尔排序 思路 代码以及解析 3.选择排序 思路1 代码1以及解析 思路2 代码2以及解析 4.冒泡排序 思路 代码 5.堆排序 思路 代码以及解析 ...
- 基于比较的常见的排序算法
目录 写在前面 排序 稳定性 排序的分类 常见的基于比较的排序 直接插入排序 代码 性能分析 总结 代码优化 折半插入 希尔排序 希尔排序 如何分组 代码 性能分析 选择排序 代码 性能分析 双向选择 ...
- 排序算法之计数排序、基数排序和桶排序
转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...
最新文章
- wince下实现wifi无线网络的连接和配置(WLAN)
- 编码互换变量c语言,【剑仙教程】TC。字符 和字符编码 互换。
- 不会出现这样的情况吧
- Linux时间 时区 同步
- mysql workbench启动_怎么启动mysql workbench
- c+ +三角函数_C ++中的三角函数
- [前端漫谈_4] 从 薛定谔的猫 聊到 Event loop
- [转载]帮你入门 详解JRE和JDK的区别
- Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
- 烂泥:centos6.4服务器添加新硬盘
- 谈谈我对-大学-游戏-追名逐利-等10个话题的一些简要看法
- tikz画GPS卫星电文通信结构图
- python替换字符的操作_Python中的字符串替换操作示例
- 计算机配置文件损坏,怎样修复Windows 10的用户配置文件无法加载错误?
- SSh框架的整合流程
- 社交App系统架构--自己亲手写的App系统(含github源码)
- ARFoundation系列讲解-教程目录
- 十大开源安全测试工具
- 计算机编辑视频用什么配置文件,AE/PR剪辑视频需要什么电脑配置?适合剪辑视频的电脑配置推荐...
- 有哪些实用的文字转语音工具值得推荐?收藏了
热门文章
- 前端学习(1002):简洁版滑动下拉菜单问题解决
- 第三十四期:花了一个星期,我终于把RPC框架整明白了!
- 54include对象
- ls mac 显示最近修改日期_Find Any File for Mac(Mac本地文件搜索工具)
- vue使用better-scroll实现下拉刷新、上拉加载
- 小程序input实现数据双向绑定
- d3.js(相当于svg的JQ)
- https无法访问 宝塔_宝塔面板快速开启ssl(https)的方法
- [Python] 制作启动uiautomator2 的web版 uiautomatorviewer2 批处理启动
- Tomcat服务器的安装及配置