排序算法的总结
排序算法总共有8个,每一种排序方法的思想都不相同,体现了编程解决问题的多样性,每一种排序方法都有不用的思想,从而可能有不同的时间复杂度和其他方便的区别,因此此篇来对排序算法进行一个总结
需要知道的术语:
- 稳定;没有排序前a的下一个数为b,当a==b时,若经过排序之后,a仍然在b的前面,则排序算法是稳定的。
- 不稳定:排序之后,a在b的后面,发生了位置的变化
- 内排序:所有的排序是在内存中完成的
- 外排序:所有的排序需要借助磁盘,排序时需要通过磁盘和内存的数据传输。
- 时间复杂度:一个算法执行时,基本操作语句的执行次数,可以简单理解为算法执行的时间
- 空间复杂度:运行一个程序需要的内存大小
排序算法 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 | 简单思路描述 |
---|---|---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 内排序 | 稳定 | 两个比较,把最大的数放到后面,一直交换,知道最后 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 内排序 | 不稳定 | 假设第一个值最小,遍历数组中的最小值并标记下来,遍历结束后才进行交换,然后假设第二个值最小。。。 |
插入排序 | O(n2) | O(n) | O(n2) | O(1) | 内排序 | 稳定 | 重新引入一个空数组,依次比较之后插入到相应的位置 |
希尔排序 | O(n log n) | O(n log2n) | O(n log2n) | O(1) | 内排序 | 不稳定 | 先进行分组,微调,最后利用插入排序算法进行排序 |
归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | 外排序 | 稳定 | 利用递归,先进行拆分,拆到最后进行递归合并 |
快速排序 | O(n log n) | O(n log n) | O(n2) | O( log n) | 内排序 | 不稳定 | 假设第一个值为基准值,然后从右边开始扫描,当扫到比基准值小的数,停下,左边离开时扫描,当扫到比基准值大的停下,两者进行交换之后,将中间值放到i==j的地方 |
堆排序 | O(n log n) | O(n log n) | O(n log n) | O(1) | 内排序 | 不稳定 | 利用二叉树的顺序存储法,将数组编程大顶堆(升序)然后把第一个元素和最后一个元素来交换 |
基数排序 | O(n*k) | O(n*k) | O(n*k) | O(n+k) | 外排序 | 稳定 | 分别对个位数,十位数,百位数等进行排序,最后就是结果,需要二维数组来进行记录。 |
注:n表示数据的规模,其中k表示桶的个数。 |
记忆方法:不稳定的排序:选择希尔快速堆
不根据数据的长度变化的:选择归并堆