排序算法
- 内部排序算法:需要排序的数据可以一次全部加载到内存中
- 外部排序算法:需要排序的数据数量太过庞大,不能一次性全部加载到内存中
十个排序算法的动图解释:https://www.cnblogs.com/onepixel/articles/7674659.html
速度从快到慢
基数排序 > 快速排序 > 归并排序> 希尔排序(移动法)> 堆排序 > 简单选择 > 直接插入 > 冒泡 > 希尔排序(交换法)
1.冒泡排序(稳定)
每次从头开始到未排好序部分的末尾,依次比较相邻数据,如果与要求的顺序逆序,则交换,直到某一次循环中没有发生交换结束
- n-1次外循环
- 每次循环“末尾”数据排好,即尾部为排好序的部分
- 每次内循环比上一次减1
2.简单选择算法(不稳定)
每次选出剩余未排序数据中最小/大的数据,然后与未排好序的首个数据进行交换
- n次外循环
- 首部为排好序的部分
- 每次内循环减1
一次外循环最多交换一次数据,选择的过程只是记录索引位置
3.直接插入排序(稳定)
将排序的数组看成有序部分和无序部分,从无序部分中拿出一个数直接插入到有序部分合适的位置
- 首次将第一个数据看成有序部分,剩余为无序部分
- n-1次外循环
4.希尔排序(不稳定)
分组排序,第一次循环是2个数据一组,第二次循环为4个数据一组,第三次循环为8个数据一组……依此类推直到全部个数为一组,使得组内元素为有序。
- 第i次循环共有n/(2^i)个组
- 每组数据与相邻数据的下标差为n/(2^i),即组数
- 组内采用直接移动法或者交换法
5.快速排序(不稳定)
- 以一个数为基准,把所有比它小的放在它的左边,所有比它大的都放在它的右边
6.归并排序(稳定)
- 分治算法
分:一直拆分直到单个一个元素是一个组
治:然后再两两合并(合并有序序列为一个大的有序序列),合并的时候同时排序,直到所有元素合为一个组 - n个数据合并n-1次
7.基数排序(稳定)
- 空间换时间
- 将所有的数排齐即等位数,高位不够补0,依次比较每一位进行排序
- 从个位开始比较,放入0——9的桶里,个位是几就放入对应编号的桶里,全部放入后,然后依次从0——9桶中拿出数据覆盖原来的数组,直到全部位数都比较完成
8.堆排序(稳定)
- 升序排序采用大顶堆;降序排序采用小顶
- 尾部逐渐有序
- 将无序数排成大顶堆,交换栈顶元素与无序区末尾元素,重新调整为大顶堆,然后再交换直到全部有序