Skip to content

Latest commit

 

History

History
executable file
·
46 lines (41 loc) · 3.7 KB

File metadata and controls

executable file
·
46 lines (41 loc) · 3.7 KB

内部排序

概述

  • 排序:将一组杂乱无章的数据按照一定规律顺次排列
  • 数据表:待排序数据元素的有限集合
  • 排序算法的稳定性:数据表中两个相同的值在经过算法排序后的相对位置是否改变
  • 内排序:排序期间数据元素全部在内存中
  • 外排序:数据太多,只能部分在内存中进行,需要不断进行内外存的数据转移
  • 排序的时间开销:衡量算法好坏的标志,主要表现是数据比较次数和数据移动次数
  • 总关键字比较次数:KCN
  • 元素移动次数:RMN

内部排序

  • 插入排序:每步将一个待排序的元素按照其关键字的大小,插入到前面已经排好序的一组元素的适当位置上面,直到全部元素插入完毕为止
    • 直接插入排序:从unsorted的列表中找到最大的和sorted列表中最后一个元素交换
    • 折半插入排序:利用折半查找算法,找到合适的位置层层递进插入(类似二叉查找树),实际复杂度取决于数据表的初始排列
    • 2-路插入排序:复制一个新的数据表,遍历原数据表时判断与新数据表的关系选择插入位置
    • 表插入排序:使用链表实现直接插入排序
  • 希尔排序:(缩小增量排序)按照一个k的维度进行排序,开始时k值较大,子序列中元素较少,速度快;后来基本已完成排序,需要移动的元素减少,速度仍然很快
  • 冒泡排序:两两比较,逆序交换
  • 快速排序:任取待排序数据表中的某个元素作为枢轴,按照该元素关键字大小,将整个元素序列划分为左右两个子序列(左侧小于等于、右侧大于),分别对两个子序列重复以上操作。
    • 按照快排的递归树的路径,快排的趟数等于树的高度。
  • 选择排序:每一趟在后面n-i个待排序元素中选出关键字最小的元素,作为有序元素序列中的第i个元素,待到第n-2趟运行完,待排序元素只剩一个,结束排序
    • 直接选择排序:在一组元素V[i]-V[n]中选择有最小关键字的元素;如果不是第一个,则与第一个对调;在剩下的V[i+1]-V[n]中继续执行。
    • 树型选择排序:对直接选择排序进行改进,减少关键字比较次数;对n个记录的关键字两两比较,选取n/2个最小者;再将n/2个数字进行两两比较,找出n/4个最小者,直到只剩一个关键字为止
    • 堆排序(弥补树型选择排序的不足):
      • 构建大(小)根堆:满足树的任一非叶子节点的关键字均不大(小)于其左右孩子结点的关键字
      • 调整堆:比较根结点和其左右孩子的关键字的值
    • 归并排序:将两个或两个以上的有序表合并成一个新的有序表(稳定算法)
      • 两路归并:先排序两个一组的元素组,再合并两个元素组,一直到只剩一个元素组为止
    • 基数排序:
      • 多关键字排序的方法

排序方法比较

排序方法 比较次数 移动次数 稳定性 附加存储
直接插入排序 n~n2 0~n2 稳定 1
折半插入排序 n log2n 0~n2 稳定 1
起泡排序 n~n2 0~n2 稳定 1
快速排序 n log2n~n2 log2n~n 不稳定 log2n~n
简单选择排序 n2 0~n 不稳定 1
树型选择排序 n log2n n log2n 稳定 n
堆排序 n log2n n log2n 不稳定 1
归并排序 n log2n n log2n 稳定 n