算法思路都是我自己的话描述的
1.内部排序:排序的基本概念;
n个关键字进行基于比较的排序,则至少进行关键词之间两两比较的次数:(log2,n!)向上取整
2.插入排序
包括直接插入排序、 折半插入排序、希尔(shell)排序;
过程特征:每一趟排序不一定有元素出现在最终位置
2.1直接插入排序(稳定)
适用于顺序存储和链式存储的线性表
算法思路:从第i=2个元素开始,前i-1个元素有序序列,每次将当前元素插入到前面的有序序列当中。
2.2折半插入排序(稳定)
适用于顺序存储(需要随机存取)
比较(折半查找插入位置)、移动(将插入位置后的元素向后移动)操作分离
2.3希尔排序(不稳定)
适用于顺序存储(利用了顺序存储随机存取的特性)
算法思路:对跳跃分割的子序列进行直接插入排序(此时满足记录较少的条件),每次循环增量变小,最后变为1,即对(基本有序)的全体记录进行一次直接插入排序。
3.交换排序
交换类排序趟数与序列初始状态有关。而直接插入、简单选择始终为n-1趟。
包括冒泡排序、快速排序;
3.1冒泡排序(稳定)
简单交换排序。
冒泡排序:相邻比较,从后往前(从前往后),每一趟会将最小(大)的交换到待排序列的第一个位置(最后一个)。
冒泡改进:若某一趟没有发生交换,则已经有序,排序结束。
过程特征:每趟排序都会有一个待排序列中最大or最小的出现在最终位置上。
3.2快速排序(不稳定)
算法思路:递归实现,每次选择pivotkey将序列中小于他放在其左边,大于他的放在右边,成为两个子序列,返回pivot为枢轴记录的位置,递归调用快速排序算法对这两个子序列分别进行快速排序。
当每次的枢轴都把表等分为长度相近的两个子表时,速度是最快的
原数组本就有序时,是最坏的情况(枢轴记录选择第一个数)。
过程特征:每趟排序会有元素出现在最终位置,看几趟排序后的结果序列时,可以写出最终排序结果进行最终位置的比对。
4.选择排序
包括简单选择排序、堆排序;
过程特征:每趟排序都会有一个待排序列中最大or最小的出现在最终位置上。
4.1简单选择排序(不稳定)
元素间的比较次数只与元素总数有关,与序列的初始状态无关。
4.2堆排序(不稳定):
利用了顺序存储的随机存取
选取规律:通常,取一大堆数据中的 k 个最大(最小)的元素时,都优先采用堆排序。
利用满足大顶堆(小顶堆)的完全二叉树的堆结构完成,
堆支持插入删除操作,一次插入删除的时间复杂度为o(log2n)。即插入删除操作的比较次数小于树的高度。
算法思路:分为构建大顶堆(从下到上,从右往左的非叶节点(从n/2向下取整开始))和排序并调整大顶堆两步,每次调整都是调整根结点s及其子树为大顶堆or小顶堆。
5.归并排序(稳定)
利用了顺序存储的随机存取
相对于堆排序来说更简单的利用完全二叉树排序。
选择排序的比较次数与序列初始状态无关,归并排序的比较次数的数量级也与序列的初始状态无关。
5.1 二路归并排序
算法思路:
递归:通过递归堆栈分分分,退出递归合合合(分出最后不足2的子序列可以在序列内部)
非递归实现:通过k值分。直接循环合合合(最后不足2的子序列一般在序列末尾)
过程特征:每趟排序后的元素不一定在最终位置
元素总数N、排序的趟数m和k路归并排序的k的关系:k^m=N,求出m向上取整。
题目中模拟二路归并时,按照非递归程序模拟。
6.基数排序(稳定)
过程特征:每趟排序后的元素不一定在最终位置
时间复杂度与初始状态无关
基于关键字各位的大小
分为MSD(最高位优先)和LSD(最低位优先)
7.各种内部排序算法的比较
时空复杂度、稳定、适用性、过程特征(各算法每一趟的效果(是否在最终位置--))
8种排序算法的时间复杂度、空间复杂度、稳定性比较
三种简单排序算法的移动次数比较
排序趟数:交换类排序(冒泡、快排)趟数与序列初始状态有关。而直接插入、简单选择始终为n-1趟。基数排序为d(关键字的d元组)趟分配和收集。
元素移动次数:基数排序的元素移动次数与关键字的初始排列次序无关,简单选择、直接插入、冒泡、快排都与关键字的初始排列相关。
元素比较次数:选择排序的比较次数与序列初始状态无关,归并排序的比较次数的数量级也与序列的初始状态无关,即性能与输入元素序列无关。
元素交换次数(三次移动)
四个改进算法+折半插入排序都利用了顺序存储的随机存取特性
8.内部排序算法的应用
选取排序算法考虑因素:元素数目n、元素本身信息量的大小、关键字的结构(基数)、数据的存储方式、数据的初始状态(分布情况)、算法的稳定性、语音工具的条件(存储结构、辅助空间)
选取规律:
n较小(小于10000):直接插入(规模很小<=25)or简单选择or冒泡
基本有序:直接插入or冒泡排序
n<=1000中等规模:希尔排序
n较大:快排(平均时间最短,但最坏情况为n^2)、堆排序(空间复杂度最小)、归并排序(稳定,空间复杂度最大,且可与直接插入结合,先求若干有序子序列后合并)。
基于比较的排序方法至少需要n*log2n的时间
n很大,关键字位少可分解:基数排序
记录本身信息量大:可用链表作为数据结构,以避免大量时间移动记录。