前言
一提排序算法,大家脑海中就会想起插入,冒泡,选择……很多种排序算法。东西一多,大家就容易头疼。所以,在总结各个算法之前,我们先来减负。
精髓
- 基本操作是两个数之间进行比较。
- 每一类排序算法都有基本算法和优化算法(也可以称作无前提的算法和有前提的算法)。
- 优化算法是建立在一定基础前提之上(待排序序列已经有一定的顺序了)。
- 优化算法会降低时间复杂度,但是以增加空间复杂度为代价。(实际当中我们需要在时间复杂度和空间复杂度之间寻找平衡)
归类
插入排序
直接插入排序
思想:将一个待排序的序列插入到一个最开始只有一个元素的有序序列中。随着插入操作进行,有序序列的长度逐渐增长。
>注意:插入的时候要确定插入的位置,如何确定呢?与有序表中已有的元素进行比较,比较的时候是从后向前(从右向左)比。
希尔排序
思想:每次按一个增量进行分组,将一组内的数据进行直接插入排序。直到增量=1.把增量理解为下标的间距。如下图,当增量为5时,把下标为0的数和下标为5的数放到一组,因为5-0=5,正好等于增量值。增量为几,就会分成几组。(按增量分组+直接插入排序)
交换排序
冒泡排序
思想:两个数进行比较,逆序则交换。
快速排序
思想:每一趟取第一个数据为标准,将数据分为小于它的和大于它的。按这种规则在对分成的每部分进行排序。
选择排序
简单选择排序
思想:每一趟找到最小的放到前面的一个位置。如第一趟找到最小的放在第一个位置,第二趟从剩下的当中找到最小的放在第二个位置……
堆排序
思想:不论是建堆还是调整堆都用到了反复“筛选”的过程。每次都会以一个结点作为标志,从该结点的孩子结点中寻找是否有小于该标志的。发生交换后,再从变动的结点的孩子结点中寻找是否有比该标志小的。
归并排序
思想:将两个有序序列合并成一个有序序列。而对于每一个有序子序列,则需要再分成两个有序序列进行合并,直到分解成每个单独有序的关键字,再按它们分解之前的方式合并。
基数排序
思想:如果关键字是十进制的,则基数为10,那么先看每个数的个位,将关键字分配到0,1,2,3,4,5,6,7,8,9中,再看十位,按相同方式分配,知道遍历完所有数位。
复杂度和稳定性
版权声明:本篇文章转载自许晨阳的播客,原文链接:http://blog.csdn.net/u010924834/article/details/45848559