这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记。
这篇来总结一下数据结构与算法那节课的内容。
主要是几种不同的排序思想。
冒泡排序
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定排序算法
基本思想:
两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。之所以叫做冒泡排序,是因为每次将一个最大或最小的数往后沉淀,沉淀到后面的数比它大或比它小为止,类似于泡泡向上浮起来的过程。
选择排序
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定排序算法
基本思想:
通过n-1次关键字比较,从n-i+1个记录中选择关键字最小的记录,并和第i个记录交换。
插入排序
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定排序
基本思想:
插入排序(直接插入排序)是一种最简单的排序方法,其基本操作是将一条记录插入到已排号的序列当中,从而得到一个有序的记录。
希尔排序
时间复杂度:时间复杂度比较复杂,通常认为O(n*log 2 n),当n趋近于无穷大时,可以为O(n(log2 n)^2)
空间复杂度:O(1)
稳定性:不稳定
基本思想:
希尔排序实质上是采用分组插入的方法,先将整个待排序记录序列分成几组,从而减少参与直接插入排序的数据量,对每组分别进行直接插入排序,然后增加每组的数据量,重新分组,这样经过几次分组后,整个序列基本有序,在对全体进行插入排序,希尔排序记录的分组,不是简单的逐段分组,而是将相隔某个记录增量的记录分成一组。
堆排序
时间复杂度:O(nlog2 n)
空间复杂度:O(1)
稳定性:不稳定
基本思想:
堆排序是一种树性选择排序,再排序过程中,将排序序列a[n]看成一个完全二叉树,利用二叉树双亲节点与孩子节点的内在联系,在当前无序的序列中,选择的关键字最大(或最小)的记录。
##归并排序
时间复杂度:O(nlog2n)
空间复杂度:O(n)
稳定性:稳定排序
基本思想:
假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,再两两归并。。。如此重复,直到得到一个长度为n的有序序列为止。