常见排序算法的基本原理思想及时间复杂度概括
概括: 冒泡排序 插入排序 选择排序 快速排序 堆排序 桶排序 希尔排序 计数排序 总结
几种排序的概念思想以及时间复杂度情况:
1、冒泡排序
基本思想:每次此循环确定未排序的数组的最大值(每轮遍历固定一个元素),出现逆序交换元素,通过比较元素的大小,将较大的数依次交换到最后面。(或者每次寻找最小值,依次交换到最前边)。
复杂度分析:时间复杂度O(N^2),空间复杂度O(1)。
2、插入排序
基本思想:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。可以理解为玩扑克牌时的理牌;
复杂度分析:时间复杂度O(N^2),空间复杂度O(1)。
3、选择排序
基本思想:在未排序序列中找到最小元素,存放到排序序列起始位置。再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。(或者每次在未排序的数组中找最大值,加入排序序列)
复杂度分析:时间复杂度O(N^2),空间复杂度O(1)。
4、归并排序
基本思想:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。它使用了递归分治的思想。简言之,先递归的分解数组,再合并有序数组。
复杂度分析:时间复杂度O(NlogN),空间复杂度O(N)。
5、希尔排序
基本思想:希尔排序是插入排序的一种高效率的实现,也叫缩小增量排序。先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序。
对于增量的序列取法?
关于取法,没有统一标准,但最后一步必须是1;因为不同的取法涉及时间复杂度不一样,具体了解可以参考《数据结构与算法分析》;一般以length/2为算法。(再此以gap=gap*3+1为公式)
复杂度分析:时间复杂度O(N^3/2 ),最坏时间复杂度O(N^2),空间复杂度O(1)。
6、随机快速排序
基本思想:首先,从数组中随机挑出一个元素,作为基准值(pivot);然后,按照基准进行分区(partition)操作,最后,递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
复杂度分析:时间复杂度O(NlogN),空间复杂度O(N)。
7、堆排序
基本思想:堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
复杂度分析:时间复杂度O(NlogN),空间复杂度O(1)。
8、计数排序
基本思想:将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
找出待排序的数组中最大和最小的元素;
统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
复杂度分析:时间复杂度O(N + K),空间复杂度O(N + K)。
|