数据结构--排序

算法思路都是我自己的话描述的

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很大,关键字位少可分解:基数排序

记录本身信息量大:可用链表作为数据结构,以避免大量时间移动记录。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值