排序算法总结
2015-09-04 23:41
337 查看
前言
一提排序算法,大家脑海中就会想起插入,冒泡,选择……很多种排序算法。东西一多,大家就容易头疼。所以,在总结各个算法之前,我们先来减负。精髓
基本操作是两个数之间进行比较。每一类排序算法都有基本算法和优化算法(也可以称作无前提的算法和有前提的算法)。
优化算法是建立在一定基础前提之上(待排序序列已经有一定的顺序了)。
优化算法会降低时间复杂度,但是以增加空间复杂度为代价。(实际当中我们需要在时间复杂度和空间复杂度之间寻找平衡)
归类
插入排序
直接插入排序
思想:将一个待排序的序列插入到一个最开始只有一个元素的有序序列中。随着插入操作进行,有序序列的长度逐渐增长。>注意:插入的时候要确定插入的位置,如何确定呢?与有序表中已有的元素进行比较,比较的时候是从后向前(从右向左)比。
希尔排序
思想:每次按一个增量进行分组,将一组内的数据进行直接插入排序。直到增量=1.把增量理解为下标的间距。如下图,当增量为5时,把下标为0的数和下标为5的数放到一组,因为5-0=5,正好等于增量值。增量为几,就会分成几组。(按增量分组+直接插入排序)交换排序
冒泡排序
思想:两个数进行比较,逆序则交换。快速排序
思想:每一趟取第一个数据为标准,将数据分为小于它的和大于它的。按这种规则在对分成的每部分进行排序。选择排序
简单选择排序
思想:每一趟找到最小的放到前面的一个位置。如第一趟找到最小的放在第一个位置,第二趟从剩下的当中找到最小的放在第二个位置……堆排序
思想:不论是建堆还是调整堆都用到了反复“筛选”的过程。每次都会以一个结点作为标志,从该结点的孩子结点中寻找是否有小于该标志的。发生交换后,再从变动的结点的孩子结点中寻找是否有比该标志小的。归并排序
思想:将两个有序序列合并成一个有序序列。而对于每一个有序子序列,则需要再分成两个有序序列进行合并,直到分解成每个单独有序的关键字,再按它们分解之前的方式合并。基数排序
思想:如果关键字是十进制的,则基数为10,那么先看每个数的个位,将关键字分配到0,1,2,3,4,5,6,7,8,9中,再看十位,按相同方式分配,知道遍历完所有数位。复杂度和稳定性
版权声明:本篇文章转载自许晨阳的播客,原文链接:/article/1821931.html
相关文章推荐
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- 文本编辑工具vim的使用方法练习
- iOS开发-用ZipArchive添加和解压zip包
- apache+tomcat反向代理
- mysql SQL Select 语句 简单应用
- GraphX的基本介绍
- VS2015+OpenCV3.0配置教程
- 杭电OJ-2093_考试排名
- 简单文本函数
- vncserver的自动启动及vncserver桌面的自动准备
- Xcode默认快捷键太别扭,一招教你制服它!
- poj 3624
- 程序包管理之rpm/yum/编译
- Linux命令汇总之正则表达式
- 第九届吉林省省赛
- 剑指offer:输入一个链表,输出该链表中倒数第k个结点。
- Unity3d使用Socket与java服务器通信
- [转载]程序员的激情其实是一种痛苦
- DOM对象和内置对象(中)