数据结构学习笔记(Ⅷ):排序
目录
1 排序基础
1.1 排序的基本概念
2 排序算法
2.1 插入排序
1.思想
2.实现
3.效率分析
4.优化
2.2 希尔排序
1.定义
2.实现
3.效率分析
3 交换排序
3.1 冒泡排序
1.定义
2.实现
3.效率分析
3.2 快速排序
1.算法思想
2.实现
3.效率分析
4 选择排序
4.1 简单选择排序
1.定义
2.实现
3.效率分析
4.2 堆排序
1.根堆
2.根堆建立
3.堆排序
4.效率分析
4.3 堆排序插入删除
1.插入
2.删除
5 其他排序算法
5.1 归并排序
1.原理
2.实现
3.效率分析
5.2 基数排序
1.定义
2.效率分析
3.适用领域
6 外部排序
6.1 外部排序
1.内外存数据交换
2.外部排序
3.时间分析
4.算法优化
6.2 败者树
1.算法思想
2.实现
6.3 置换-选择排序
6.4 最佳归并树
1 排序基础
1.1 排序的基本概念
排序:按关键字有序地排列表中的元素
评价指标:时间与空间复杂度、算法稳定性
分类:内部排序(数据在内存中)、外部排序
2 排序算法
2.1 插入排序
1.思想
算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成
2.实现
void Insertsort(int a[],int n)
{int i,j = 0;for (i = 0; i < n; i++) // 遍历整个数组{if (a[i] < a[i - 1]) // 若当前元素小于其前驱,进入下一层循环{int temp = a[i]; // 因当前元素应位于其前驱之前,先存放在临时变量中 for (j = i - 1; j >= 0 && a[j] > temp; --j) // 遍历该元素前驱之前的元素{a[j + 1] = a[j]; // 前驱依次后移}a[j+1] = temp; // 将该元素放在比他大的前驱前}}
}
3.效率分析
空间复杂度O(1)
时间复杂度:O(n) ~ O(n^2)
平均时间复杂度:O(n^2)
稳定性:稳定
4.优化
2.2 希尔排序
1.定义
希尔排序︰先将待排序表分割成若干子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。
2.实现
3.效率分析
空间复杂度:O(1)
最坏时间复杂度:O(n^2)
稳定性:不稳定
仅适用于顺序表
3 交换排序
3.1 冒泡排序
1.定义
从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。
2.实现
3.效率分析
空间复杂度:O(1)
时间复杂度:最好O(n),最坏O(n^2),平均O(n^2)
稳定性:稳定
适用于链表排序
3.2 快速排序
1.算法思想
在待排序表L[1..n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1..k-1]和LIk+1..n],使得L1...k-1]中的所有元素小于pivot,Llk+1..n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。
2.实现
3.效率分析
稳定性:不稳定
适用于链表排序
4 选择排序
4.1 简单选择排序
1.定义
每一趟在待排序元素中选取关键字最小的元素加入有序子序列
2.实现
3.效率分析
空间复杂度:O(1)
时间复杂度:O(n^210)
稳定性:不稳定
适用于链表
4.2 堆排序
1.根堆
若n个关键字序列L[ 1...n]满足下面某一条性质,则称为堆(Heap) :
若满足:L(i)≥L(2i)且L(i)≥L(2i+1) (1 ≤i sn/2) —―大根堆(大顶堆)
若满足:L(i)≤L(2i)且L(i)≤L(2i+1) (1 s i ≤n/2 ) —―小根堆(小顶堆)
将大(小)根堆看作顺序存储的完全二叉树,即根结点大(小)于左/右子树结点。
2.根堆建立
检查所有非终端结点(i <= [n/2])是否满足要求,若不满足将当前结点与更大的子树结点互换。
3.堆排序
每一轮都将堆顶元素加入有序子序列(与待排序中的最后一个元素交换),并将待排序元素序列再次调整为根堆。
基于大根堆得到递增序列
4.效率分析
若树高为h,某结点在第i层,则将这个结点向下调整最多只需要“下坠”h-i层,关键字对比次数不超过2(h-i)
时间复杂度:建堆O(n) + 堆排序O(n1og_2n) = O(n1og_2n)
空间复杂度:O(n)
稳定性:不稳定
4.3 堆排序插入删除
1.插入
以小根堆为例,新元素放入表尾,与父节点对比,若新元素较小就交换,持续上升。
2.删除
用堆底元素代替被删除的元素,并将该元素进行下坠交换。
5 其他排序算法
5.1 归并排序
将两个或多个有序序列合并
1.原理
2.实现
将一个序列拆分成两个序列进行多轮归并排序
3.效率分析
时间复杂度:O(n*Log_2n)
空间复杂度:O(n)
5.2 基数排序
1.定义
第一轮以个位进行分配,将各元素链接后得到按个位递减排序的序列;次轮以十位进行分配,将各元素链接后得到按十位递减排序的序列;再次轮按百位进行分配,得到按百位递减排序的序列
2.效率分析
一轮分配O(n),一轮手机O(r),共d轮分配与收集
时间复杂度:O(d*(n + r))
空间复杂度:O(r)
稳定性:稳定
3.适用领域
6 外部排序
6.1 外部排序
1.内外存数据交换
2.外部排序
因数据元素过多,外存数据无法全部读入内存进行排序,因此要进行基于归并排序的外部排序。
3.时间分析
外部排序时间开销=读写外存的时间+内部排序所需时间+内部归并所需时间
4.算法优化
可以使用多路归并,减少读写外存的时间。但内存开销与归并所需时间会增加
6.2 败者树
多路归并数增加,导致内部归并所需时间增加。
1.算法思想
可视为—棵完全二叉树(多了一个头头)。k个叶结点分别是当前参加比较的元素,非叶子结点用来记忆左右子树中的“失败者”,而让胜者往上继续进行比较,一直到根结点。
2.实现
6.3 置换-选择排序
6.4 最佳归并树
要使磁盘I/O次数最少,就要让归并树的带权路径长度最小,构造K叉哈夫曼树。
数据结构学习笔记(Ⅷ):排序相关推荐
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
- Python数据结构学习笔记——栈
目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...
- 数据结构学习笔记之快速排序(非递归)
数据结构学习笔记之快速排序(非递归) 代码如下: #include<assert.h> #include<memory.h> //快速排序(升序) void QuickSort ...
- 考研[*数据结构*]学习笔记汇总(全)
文章目录: 一:预备阶段 二:基础阶段笔记 三:冲刺阶段笔记 四:各章节思维导图 五:题库 来源:王道计算机考研 数据结构 一:预备阶段 之前的数据结构笔记 数据结构--学习笔记--入门必看[建议收藏 ...
- 数据结构学习笔记(王道)
数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录 数据结构学习笔记(王道) 一.绪论 1.1. 数据结构 1.2. 算法 1.2.1. 算法的基本概念 1.2.2. ...
- 数据结构学习笔记(3-5):树
附录:所有blog的链接 数据结构学习笔记(1):基本概念 数据结构学习笔记(2):线性结构 数据结构学习笔记(3-5):树 数据结构学习笔记(6-8):图 数据结构学习笔记(9-10):排序 数据结 ...
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
- 数据结构学习笔记(六):二叉树(Binary Tree)
目录 1 背景知识:树(Tree) 2 何为二叉树(Binray Tree) 2.1 二叉树的概念与结构 2.2 满二叉树与完全二叉树 2.3 二叉树的三种遍历方式 3 二叉树及其遍历的简单实现(Ja ...
- 数据结构学习笔记(五):重识字符串(String)
目录 1 字符串与数组的关系 1.1 字符串与数组的联系 1.2 字符串与数组的区别 2 实现字符串的链式存储(Java) 3 子串查找的简单实现 1 字符串与数组的关系 1.1 字符串与数组的联系 ...
- 数据结构学习笔记(四):重识数组(Array)
目录 1 数组通过索引访问元素的原理 1.1 内存空间的连续性 1.2 数据类型的同一性 2 数组与链表增删查操作特性的对比 2.1 数组与链表的共性与差异 2.2 数组与链表增删查特性差异的原理 3 ...
最新文章
- PL/SQL复合变量
- 手动安装K8s第六节:node节点部署-kubelet
- ORA-04031:oracle无法分配共享内存
- linux新手程序,linux新手需要掌握的入门级命令
- sublime text 3 中的php代码语法检测
- Linux多线程——使用信号量同步线程
- Windows Server 2012 R2 里面如何安装Net Framework 3.5
- 2万字长文包教包会 JVM 内存结构
- NVIDIA DLI 深度学习培训 | 北京站 即将开班
- Ubuntu 12.04.1 mysql从5.5升级到5.6
- LeetCode 207. 课程表(广度优先遍历)
- FuelPHP 系列(三) ------ Model 模型
- ActiveX如何调用引用该ActiveX的网页中的JavaScript函数
- GNN-图卷积模型-2017:GAT【消息传递(前向传播):聚合函数+更新函数】【聚合函数:attention(邻域所有节点根据注意力机制进行加权)】【训练更新函数的参数】【直推式归纳式】【同质图】
- 字节跳动做教育能否摆脱互联网公司“流量魔咒”?
- 回复 程序员如何做SOHO接私单
- 外包被裁能要n+1吗?签约软通动力,在滴滴工作,滴滴裁员,我要n+1,软通不认!...
- 在centos上安装vmware14
- Android OpenGLES滤镜开发之贴纸效果
- c++基础学习:输入cin、输出cout、换行endl