考研数据结构考点之排序

8.1 排序的基本概念

  1. 排序算法的评价指标
    1. 时间复杂度
    2. 空间复杂度
    3. 稳定性;是指两个值相等的关键字经过排序后相对位置是否发生变化,没有变化是稳定的,否则不稳定;
  2. 排序算法的分类

image.png

8.2 插入排序

8.2.1 直接插入排序

空间复杂度 O(1)
最好时间复杂度(全部有序) O(n)
最坏时间复杂度(全部逆序) O(n²)
平均时间复杂度 O(n²)
算法稳定性:稳定
适用性:顺序存储或链式存储都可以
在元素序列基本有序的前提下,效率还是很高的

8.2.2 折半插入排序

空间复杂度 O(1)
平均时间复杂度 O(n²)
算法稳定性:稳定
适用性:顺序存储结构
对于数据量不很大的排序表,折半插入排序往往能表现出很好的性能

8.2.3 希尔排序

希尔排序也被称为“缩小增量排序”
设置一个增量d,即相隔d个位置的元素为一个子表,先让每个子表的元素相对有序,然后让d逐渐减小为1;
希尔排序每趟并不产生有序区
空间复杂度 O(1)
最坏时间复杂度 O(n²) -----让增量d最初便等于1,相当于直接插入排序的最坏
平均时间复杂度 O(n1.3)------当n在某个范围内时,大约是…
算法稳定性:不稳定
适用性:仅适用于顺序存储结构的线性表

8.3 交换排序

8.3.1 冒泡排序

从后往前(或从前往后)两两比较相邻元素的值,若为逆序(A[j-1]>A[j]),则交换;最多只需n-1趟;
空间复杂度 O(1)
最好时间复杂度(全部有序) O(n)
最坏时间复杂度(全部逆序) O(n²)

  • 元素全部逆序时,移动次数是比较次数的3倍;
  • 因为每比较1次都会交换1次;每交换一次就会移动元素3次( temp=A[j]; A[j]=A[j-1]; A[j-1]=temp; )
  • 即比较次数=n(n-1)/2;移动次数=3n(n-1)/2;

平均时间复杂度O(n²)
算法稳定性:稳定
适用性:顺序表、链表都可以
冒泡排序每一趟排序结束后产生的有序子序列一定是全局有序的

8.3.2 快速排序

代码实现:
int Partition(ElemType A[],int low,int high){
    //pivot(支点、枢轴)
    ElemType pivot=A[low];
    while(low<high){
        while(A[high]>=pivot&&low<high)
            high--;
        A[low]=A[high];
        while(A[low]<=pivot&&low<high)
            low++;
        A[high]=A[low];
    }
    A[low]=pivot;
    return low;
}

//初始low=0;high=n-1;
void QuickSort(ElemType A[],int low,int high){
    if(low<high){
        int pivotpos=Partition(A,low,high);
        QuickSort(A,low,pivotpos-1);
        QuickSort(A,pivotpos+1,high);
    }
}


在快速排序过程中,并不产生有序子序列,但每次划分后会将枢轴(基准)元素放到其最终的位置上。

效率分析

时间复杂度 = O(n*递归层数)
空间复杂度 = O(递归层数)
递归层数相当于快速排序过程中形成的分析树(二叉排序树)的高度
即 最好情况下的递归层数 = 二叉排序树的最小高度 = log2(n+1) (向上取整)
最好情况下的递归层数 = 二叉排序树的最大高度 = n ;


时间复杂度空间复杂度
最好情况O(nlog2n)O(log2n)
最坏情况O(n²)O(n)

快速排序平均情况下的运行时间与其最好情况下的运行时间很接近,而不是接近其最坏情况下的运行时间;
故 平均时间复杂度=O(nlog2n) 平均空间复杂度O(log2n)
算法稳定性:不稳定
快速排序是所有内部排序算法中平均性能最优的排序算法
注:“一趟"排序 == ? 一次"划分” 要看报考大学历年真题中是如何处理的?

8.4 选择排序

8.4.1 简单选择排序

每次循环找出无序序列中最小的元素,与无序序列的第一个位置元素进行交换,然后无序序列的起始位置向后移,有序序列长度加一;
空间复杂度 O(1)
元素移动的次数很少,不会超过3(n-1),最好的情况是移动0次
元素间比较的次数与序列的初始状态无关,始终是n(n-1)/2,因此时间复杂度始终是O(n²)
最好时间复杂度 O(n²)
最坏时间复杂度 O(n²)
平均时间复杂度 O(n²)
算法稳定性:不稳定
适用性:顺序表、链表都可以

8.4.2 堆排序

代码实现:
typedef int ElemType;
void Swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

//将以k为根的子树调整为大根堆
void HeadAdjust(ElemType A[],int k,int len){
    A[0]=A[k];
    for(int i=2*k;i<=len;i=i*2){
        if(i<len&&A[i]<A[i+1])
            i++;
        if(A[i]<=A[0])
            break;
        else{
            A[k]=A[i];
            k=i;
        }
    }
    A[k]=A[0];
}

//建立大根堆,最后排序完成,序列元素升序排列
void BuildMaxHeap(ElemType A[],int len){
    for(int i=len/2;i>0;i--){
        HeadAdjust(A,i,len);    //从以最后一个非叶结点为根的子树开始调整
    }
}
void HeapSort(ElemType A[],int len){
    BuildMaxHeap(A,len);    
    for(int i=len;i>1;i--){
        Swap(A[1],A[i]);
        HeadAdjust(A,1,i-1);    
        //只需调整以第一个非叶结点为根的树即可,
        //因为上面交换的那一步只是把根节点和最后一个结点交换了
        //处最上层之外其他的子堆都还是满足大根堆的要求的
        //所以只需把最上层出现的小元素不断"下坠"即可
    }
    
}

效率分析
  1. 建堆的时间复杂度T1(n) = O(n)
  2. 每趟排序的时间复杂度=O(log2n) ; 一共需要排序(n-1)趟,故排序的时间复杂度T2(n) = O(nlog2n)
  3. 所以,堆排序总的时间复杂度= T1(n) + T2(n) = O(n) + O(nlog2n) = O(nlog2n) ;
  4. 空间复杂度 S(n) = O(1)
  5. 算法稳定性:不稳定
  6. 基于"大根堆"的堆排序得到递增序列,基于"小根堆"的堆排序得到递减序列
拓展

堆是用来排序的数据结构,排序时效率很高,但如果用来查找则是一种效率很低的数据结构,因为查找时堆是无序的,或者说不是严格有序,堆中只是保证了父节点的值一定大于或小于它的两个孩子而已。

8.5 归并排序和基数排序

8.5.1 归并排序(2路归并)

核心操作:把数组内的两个有序序列归并为一个
常用于外部排序

代码实现:
int *B=(int *)malloc(sizeof(int)*n);	//辅助数组B

//A[low…mid]和A[mid+1…high]各自有序,将两个部分合并
void Merge(int A[],int low,int mid,int high){
	int i,j,k;
    for(i=low;i<=high;i++){
        B[i]=A[i];			//将A中所有元素复制到B中
    }
    for(i=low,j=mid+1,k=low;i<=mid&&j<=high;k++){
        if(B[i]<=B[j])
            A[k]=B[i++];		//将较小值复制到A中
        else
            A[k]=B[j++];
    }
    while(i<=mid)
        A[k++]=B[i++];
    while(j<=high)
        A[k++]=B[j++];
}

void MergeSort(int A[],int low,int high){
    if(low<high){
        int mid=(low+high)/2;		//从中间划分
        MergeSort(A,low,mid);		//对左半部分排序
        MergeSort(A,mid+1,high);	//对右半部分排序
        Merge(A,low,mid,high);		//归并左右两个有序序列
    }
} 

效率分析
  1. 时间复杂度分析:
    n个元素进行2路归并排序,归并趟数=log2n(向上取整)
    每趟归并时间复杂度为O(n),则算法总的时间复杂度为O(nlog2n)

  2. 空间复杂度:O(n) 来自辅助数组B

  3. 算法稳定性:稳定

8.5.2 基数排序

  1. 能手动模拟算法运行过程即可,不考察代码
  2. 不需要基于比较的排序
  3. 大多基于链式存储结构实现(建立链式队列)
  4. 为实现多关键字排序,通常有两种方法:
    1. 最高位优先(MSD) ----按关键字权重递减依次进行分配、收集
    2. 最低位优先(LSD) ----按关键字权重递增依次进行分配、收集
擅长解决的问题

①数据元素的关键字可以方便地拆分为d组,且d较小
②每组关键字的取值范围不大,即r很小
③数据元素个数n较大

效率分析
  1. 空间复杂度 = O® r是基数,代表每位关键字可以取值的个数,比如十进制数的r=10
  2. 一趟分配的时间复杂度=O(n),一趟收集O®,总共d趟分配、收集,总的时间复杂度=O(d(n+r))
  3. 算法稳定性:稳定

各种排序算法的性质

IMG_20221103_183610.jpg

  • 在最好的情况下,时间复杂度可以达到线性时间的有:冒泡排序、直接插入排序。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前言 1 章 绪论1 本章概略1 1.1 针对考研数据结构的代码书写规范以及C 与C 语言基础1 1.1.1 考研综合应用题中算法设计部分的代码书写规范1 1.1.2 考研中的C 与C 语言基础3 1.2 算法的时间复杂度与空间复杂度分析基础 12 1.2.1 考研中的算法时间复杂度分析 12 1.2.2 例题选讲 12 1.2.3 考研中的算法空间复杂度分析 14 1.3 数据结构算法的基本概念 14 1.3.1 数据结构的基本概念 14 1.3.2 算法的基本概念 15 习题 16 习题答案 17 2 章 线性表 20 大纲要求 20 考点与要点分析 20 核心考点 20 基础要点 20 知识点讲解 20 2.1 线性表的基本概念与实现 20 2.2 线性表的结构体定义和基本操作 24 2.2.1 线性表的结构体定义 24 2.2.2 顺序表的操作 26 2.2.3 单链表的操作 29 2.2.4 双链表的操作 33 2.2.5 循环链表的操作 35 ▲真题仿造 35 真题仿造答案与讲解 36 习题 真题精选 37 习题答案 真题精选答案 41 3 章 栈和队列 55 大纲要求 55 考点与要点分析 55 核心考点 55 基础要点 55 知识点讲解 55 2019 版数据结构高分笔记 X 3.1 栈和队列的基本概念 55 3.1.1 栈的基本概念 55 3.1.2 队列的基本概念 56 3.2 栈和队列的存储结构、算法与应用 56 3.2.1 本章所涉及的结构体定义 56 3.2.2 顺序栈 57 3.2.3 链栈 59 3.2.4 栈的应用 60 3.2.5 顺序队 64 3.2.6 链队 66 3.3 抽象数据类型 69 ▲真题仿造 71 真题仿造答案与讲解 71 习题 真题精选 74 习题答案 真题精选答案 79 4 章 串 91 知识点讲解 91 4.1 串数据类型的定义 91 4.1.1 串的定义 91 4.1.2 串的存储结构 91 4.1.3 串的基本操作 92 4.2 串的模式匹配算法 95 4.2.1 简单模式匹配算法 95 4.2.2 KMP 算法 96 4.2.3 KMP 算法的改进 99 习题 102 习题答案 103 5 章 数组、矩阵与广义表 113 知识点讲解 113 5.1 数组 113 5.2 矩阵的压缩存储 114 5.2.1 矩阵 114 5.2.2 特殊矩阵和稀疏矩阵 115 5.3 广义表 121 习题 122 习题答案 123 6 章 树与二叉树 132 大纲要求 132 考点与要点分析 132 核心考点 132 基础要点 132 知识点讲解 132 6.1 树的基本概念 132 6.1.1 树的定义 132 6.1.2 树的基本术语 132 6.1.3 树的存储结构 133 6.2 二叉树 134 6.2.1 二叉树的定义 134 6.2.2 二叉树的主要性质 135 6.2.3 二叉树的存储结构 137 6.2.4 二叉树的遍历算法 137 6.2.5 二叉树遍历算法的改进 146 6.3 树和森林与二叉树的互相转换 155 6.3.1 树转换为二叉树 155 6.3.2 二叉树转换为树 156 6.3.3 森林转换为二叉树 156 6.3.4 二叉树转换为森林 157 6.3.5 树和森林的遍历 157 6.4 树与二叉树的应用 158 6.4.1 二叉排序树与平衡二叉树 158 6.4.2 赫夫曼树和赫夫曼编码 159 ▲真题仿造 162 真题仿造答案与解析 162 习题 真题精选 163 习题答案 真题精选答案 168 7 章 图 183 大纲要求 183 考点与要点分析 183 核心考点 183 基础要点 183 知识点讲解 183 7.1 图的基本概念 183 7.2 图的存储结构 184 7.2.1 邻接矩阵 185 7.2.2 邻接表 186 7.2.3 邻接多重表 187 7.3 图的遍历算法操作 188 7.3.1 深度优先搜索遍历 188 7.3.2 广度优先搜索遍历 189 7.3.3 例题选讲 190 7.4 小(代价)生成树 193 7.4.1 普里姆算法和克鲁斯卡尔算法 193 7.4.2 例题选讲 197 7.5 短路径 198 7.5.1 迪杰斯特拉算法 198 7.5.2 弗洛伊德算法 204 7.6 拓扑排序 207 7.6.1 AOV 网 207 7.6.2 拓扑排序核心算法 207 7.6.3 例题选讲 209 7.7 关键路径 209 7.7.1 AOE 网 209 7.7.2 关键路径核心算法 210 ▲真题仿造 213 真题仿造答案与解析 213 习题 真题精选 215 习题答案 真题精选答案 221 8 章 排序 234 大纲要求 234 考点与要点分析 234 核心考点 234 基础要点 234 知识点讲解 235 8.1 排序的基本概念 235 8.1.1 排序 235 8.1.2 稳定性 235 8.1.3 排序算法的分类 235 8.2 插入类排序 236 8.2.1 直接插入排序 236 8.2.2 折半插入排序 237 8.2.3 希尔排序 238 8.3 交换类排序 240 8.3.1 起泡排序 240 8.3.2 快速排序 241 8.4 选择类排序 243 8.4.1 简单选择排序 243 8.4.2 堆排序 244 8.5 二路归并排序 247 8.6 基数排序 248 8.7 外部排序 252 8.7.1 概念与流程 252 8.7.2 置换-选择排序 253 8.7.3 佳归并树 254 8.7.4 败者树 255 8.7.5 时间与空间复杂度相关问题 257 8.8 排序知识点小结 258 ▲真题仿造 259 真题仿造答案与解析 259 习题 真题精选 260 习题答案 真题精选答案 265 9 章 查找 275 大纲要求 275 考点与要点分析 275 核心考点 275 基础要点 275 知识点讲解 275 9.1 查找的基本概念、顺序查找法、折半查找法 275 9.1.1 查找的基本概念 275 9.1.2 顺序查找法 276 9.1.3 折半查找法 277 9.1.4 分块查找 279 9.2 二叉排序树与平衡二叉树 280 9.2.1 二叉排序树 280 9.2.2 平衡二叉树 283 9.3 B-树的基本概念及其基本操作、B 树的基本概念 286 9.3.1 B-树(B 树)的基本概念 286 9.3.2 B-树的基本操作 288 9.3.3 B 树的基本概念 292 9.4 散列表 293 9.4.1 散列表的概念 293 9.4.2 散列表的建立方法以及冲突解决方法 293 9.4.3 散列表的性能分析 297 ▲真题仿造 298 真题仿造答案与解析 298 习题 真题精选 299 习题答案 真题精选答案 304 10 章 考研中某些算法的分治法解释 318
试点•点睛】 2015 考研严蔚敏数据结构考点算法精讲 第一部分 考研数据结构_各种算法的经解分析.............................................................................................. 2 第一章 绪论 ............................................................................................................................................... 2 第二章 线性表 ........................................................................................................................................... 3 第三章 栈和队列 ....................................................................................................................................... 4 第四章 串 ................................................................................................................................................... 7 第五章 数组结构 ....................................................................................................................................... 9 第六章 树与二叉树 ................................................................................................................................. 12 第七章 图 ................................................................................................................................................. 25 第八章 内部排序 ................................................................................................................................... 39 第二部分 《数据结构》必须掌握的知识点与算法...................................................................................... 44 第一章 绪论 ............................................................................................................................................. 44 第二章 线性表 ......................................................................................................................................... 44 第三章 栈和队列 ..................................................................................................................................... 45 第四章 树和二叉树 ................................................................................................................................. 46 第五章 图 ................................................................................................................................................. 47 第六章 查找 ............................................................................................................................................. 48 第七章 内部排序 ..................................................................................................................................... 48 第三部分 清华大学严蔚敏版数据结构考研要点(精华版) ........................................................................... 50

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸鱼的眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值