一、概述
数据结构:对计算机内存中的数据的一种安排。
算法:对结构中的数据进行各种处理。
二、应用方面:
1、现实世界数据存储;
2、程序员的工具;
3、现实世界的建模。
三、各数据结构优缺点
数据结构类别 | 优点 | 缺点 | 链接 | 备注 |
无序数组 | 插入快,可以直接放到末尾O(1) | 查找慢O(N)、删除慢O(N)、大小固定 | 点击打开链接 | |
有序数组 | 比无序数组查找快O(LogN),可以使用二分查找 | 删除慢O(N)、插入慢O(N),大小固定,由于是有序的,插入需移动其他项 | 点击打开链接 | |
单链表 | 插入快O(1) | 查找慢O(N)、删除慢O(N),若从首或尾删除较快O(1) | 点击打开链接 | 每个节点有下一个节点的引用,整个链表能找到首 |
双端链表 | 插入快O(1) | 查找慢O(N)、删除慢O(N),若从首或尾删除较快O(1) | 点击打开链接 | 较单链表,整个链表能找到尾 |
双向链表 | 插入快O(1) | 查找慢O(N)、删除慢O(N),若从首或尾删除较快O(1) | 点击打开链接 | 较双端链表,每个节点有上一个节点的引用 |
有序链表 | 比无序链表查找快O(LogN)、删除快O(LogN),可以使用二分查找。插入也可以O(LogN)。 | 点击打开链接 | ||
二叉树 | 查找、删除、插入都快(数平衡的情况) | 删除算法复杂 | 点击打开链接 | |
红黑数(平衡树) | 查找、插入、删除快 | 算法复杂 | 点击打开链接 | |
2-3-4树(平衡树) | 查找、插入、删除快 | 算法复杂 | 点击打开链接 | |
哈希表 | 插入快,通过关键字存取快 | 删除、查找慢 | 线性探测:点击打开链接 再哈希法:点击打开链接 链地址法:点击打开链接 | 底层通过数组实现 |
堆 | 插入O(LogN)、删除快O(LogN),对最大数据项的存取快。 | 对其他数据项存取慢 | 点击打开链接 | 数据结构是完全二叉树树,底层通过数组实现,父节点关键值大于子节点,弱序 |
栈 | 提供后进先出的存取方式 | 存取其他项很慢 | 点击打开链接 | |
队列 | 提供先进先出的存取方式 | 存取其他项很慢 | 点击打开链接 | |
图 | 对现实世界建模 | 有些算法慢且复杂 | 点击打开链接 | |
四、复杂度表示法
而lg在数学里面称为常用对数,常用对数就是以10为底数的对数.【举例,10的2次方等于100,那么lg(100)就等于2】
O(1) 优秀
O(Log N) 良好
O(N) 还可以
O(N²) 差
五、数据结构
1、数组、链表、树适合于数据库应用中作为数据记录;
2、栈和队列:
(1)、通常情况作为程序员的工具来运用;
(2)、受限访问
(3)、更加抽象(主要通过接口进行定义)
(4)、底层也是通过数组或链表完成的
3、有序数组、无序数组底层是数组实现,链表底层是通过对象关联实现,树也是通过对象关联实现,哈希表底层是数组,堆底层是数组实现,栈、队列底层是数组实现。
3、数组的最大特点就是:寻址容易,插入和删除困难;而链表正好相反,寻址困难,而插入和删除操作容易。那么如果能够结合两者的优点,做出一种寻址、插入和删除操作同样快速容易的数据结构,那该有多好。这就是哈希表创建的基本思想,而实际上哈希表也实现了这样的一个“夙愿”,哈希表就是这样一个集查找、插入和删除操作于一身的数据结构。
4、通用数据结构:数组、链表、树、哈希表。
通用数据结构按速度的快慢分类:数组和链表是最慢的,树相对较快,哈希表是最快的。
但是最快的并不是最好的方案,首先最快的比数组、链表复杂,编程复杂。
六、排序算法
1、比较:
级别 | 类别 | 排序方法 | 时间复杂度 (平均情况) | 时间复杂度 (最好情况) | 时间复杂度 (最坏情况) | 空间复杂度 (辅助存储) | 稳定性 | 说明 | 连接地址 | |
简单排序 | 插入排序 | 直接插入 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 | 将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列 | 点击打开链接 | |
高级排序 | 插入排序 | 希尔排序 | O(n^(1+e))(其中0<e<1) | O(n) | O(n^2) | O(1) | 不稳定 | 插入排序的升级版。先将整个待排序的记录序列按照一定的间隔直接插入排序,然后按照一定的规则间隔逐渐缩小,直到缩小为1,这样循环的去插入排序。 | 点击打开链接 | |
简单排序 | 选择排序 | 直接选择 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 | 直接选择排序是对冒泡排序的优化,每次只有找到最小或者最大的元素才进行交换,大大减少了交换次数。 | 点击打开链接 | |
高级排序 | 选择排序 | 堆排序 | O(nLogN) | O(nLogN) | O(nLogN | O(1) | 不稳定 | 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 | 点击打开链接 | |
简单排序 | 交换排序 | 冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 | 从数组右往左依次相邻俩数比较,一次循环比较后最小的排在了最左面,依次对剩下的元素进行循环比较,反之先排出大的也可以。 | 点击打开链接 | |
高级排序 | 交换排序 | 快速排序 | O(nLogN) | O(nLogN) | O(n^2) | O(LogN) | 不稳定 | 冒泡+二分+递归分治。先从数列中取出一个数作为基准数,根据基准数将数列进行分区,小于基准数的放左边,大于基准数的放右边。重复分区操作,直到各区间只有一个数为止。 | 点击打开链接 | |
高级排序 | 归并排序 | O(nLogN) | O(nLogN) | O(nLogN) | O(n) | 稳定 | 将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,将每个子序列排成有序的。然后再把有序子序列合并为整体有序序列。 | 点击打开链接 | ||
高级排序 | 基数排序 | O(d(r+n)) r代表关键字的基数,d代表长度, n代表关键字的个数 | O(d(n+rd)) | O(d(r+n)) | O(rd+n) | 稳定 | 依次按照低、高位进行排序收集 | 点击打开链接 |
2、简单概括
3、使用准则
源码下载:点击打开链接