目录
排序的分类
基本概念
插入排序
直接插入排序
折半插入排序
希尔排序
交换排序
冒泡排序
快速排序
选择排序
简单选择排序
堆排序
二路归并排序
基数排序
选择算法需要考虑的因素
排序的分类
其中比较重要的已做标记,下面来简要介绍一下
基本概念
排序的定义:对一个数据元素集合或序列重新排列成一个按数据元素某项值有序的序列
稳定性:相同关键码元素间的位置关系,排序前后保持一致则稳定,不一致的不稳定
插入排序
-
直接插入排序
-
从前(第二个关键字)往后遍历,依次插入到前面已经排好序的子序列当中
-
时复:o(n^2) 空复:o(1) 稳定 适用:顺序和链式
-
图示
-
-
折半插入排序
-
利用折半查找来寻找待插元素的插入位置
-
时复:o(n^2) 空复:o(1) 稳定 适用:顺序
-
-
希尔排序
-
缩小增量排序,把关键字隔一定的大小分组,最终序列基本有序,再进行一次直接插入排序
-
时最坏:o(n^2) 空:o(1) 不稳定 适用:顺序
-
图示
-
交换排序
-
冒泡排序
-
像吐泡泡一样逐渐得到最大(或最小)的关键字。两两比较,若逆序则交换
-
时复:o(n^2) 空复:o(1) 稳定 适用:顺序和链式
-
图示
-
-
快速排序
-
基于分治思想,每次选择第一个元素为基准元素,比基准元素大的放一边,小的放一边,最终有序。代码中有递归,需要借助递归栈
-
时复:o(n^2) 空复:最坏o(n^2),最好o(log n) 不稳定 适用:顺序
-
图示
-
选择排序
-
简单选择排序
-
每一趟确定一个最小(或最大)的元素,放到最终位置处(与该处元素交换)
-
时复:o(n^2) 空复:o(1) 不稳定 适用:顺序和链式和关键字较少的情况
-
-
堆排序
-
建堆(大根or小根),堆是一个完全二叉树形式,每次在根节点处会得到最大(或最小)的元素,与最后一个叶节点交换,重新整理堆,以此类推
-
时复:o(n log n) 建堆时间:o(n) 空复:o(1) 不稳定 适用:顺序和链式
-
图示(详细讲解)
-
二路归并排序
-
将两个或两个以上的有序表合并成一个新的有序表,有序表中从头到尾进行比较。先是每两个元素合并,再是四个元素合并,以此类推
-
每次归并时需要把表复制一遍,每趟归并时间复杂度为o(n),需要进行(log n)次归并
-
时复:o(n log n) 空复:o(n) 稳定 适用:顺序和链式
-
图示
基数排序
-
从个位开始,依次往前进行排序(也就是优先度越高的越晚排序),需要借助队列来存储每次按位排序的链表
-
时间复杂度解释:需要进行d趟位(关键字不同则d不同)排序,一趟遍历所有关键字,时间复杂度O(n),一趟需要合并r个队列
-
时复:O(d(n+r)) 空复:o(r) 稳定 适用:顺序和链式
选择算法需要考虑的因素
-
待排序的元素个数n
-
待排序的元素的初始状态
-
关键字的结构及分布情况
-
稳定性的要求
-
存储结构及辅助空间的大小限制