
数据结构
文章平均质量分 81
欣麒骥
软件工程师
展开
-
小菜一步一步学数据结构之(一)基本概念和术语
数据结构是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。基本概念和术语*数据(data)–所有能输入到计算机中去的描述客观事物的符号的总称 *数据元素(data element)–数据的基本单位,也成结点(node)或记录(record) 数据项(data item)–有独立含义的数据最小单位,也成域(field)* 三者之间的关系:数据>数据元素>数据原创 2016-01-11 20:16:21 · 1414 阅读 · 0 评论 -
线性表的查找
查找基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作。线性表的查找在查找表中,线性表查找是最简单的一种,主要的操作为顺序查找和折半查找。顺序查找:从表的一端开始,依次将查找的关键字与给定数据库进行批对,若关键字在给定数据库中存在,则查找成功,否则当数据库从头到尾没有批对到,则查找失败。作用范围:即使用线性表的顺序存储又适合于线性表的链式存储结构。数据元素类型定原创 2016-03-09 18:42:08 · 2535 阅读 · 2 评论 -
二叉排序树
二叉排序树又称二叉查找树,它是一种对排序和查找都很有用的特殊二叉树。定义:(1)若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值;(2)若它的右子树不为空,则右子树上所有结点的值均小于它的根结点上的值;(3)它的左右子树本身也分别为二叉排序树。通过中序排列我们发现中序遍历的结果是结点的值是由低到高的。二叉排序树的二叉链表存储表示typedef struct{ keyType k原创 2016-03-10 12:16:27 · 2649 阅读 · 1 评论 -
平衡二叉树
前面我写了一篇二叉排序树,最后我们提到提高二叉排序树的查找效率是让二叉树的形状均衡,所以就引入了平衡二叉树。特点:一种特殊类型的二叉排序树所有结点的左、右子树深度之差的绝对值≤1左右子树是平衡二叉树;平衡因子:该结点左子树和右子数的高度差任意一个结点的平衡因子只能取:-1、0或1;如果树中任意一个结点的平衡因子的绝对值大于1,则这棵二叉树就失去平衡,不再是AVL树;对于一棵有n个结点的AVL原创 2016-03-13 19:29:07 · 3243 阅读 · 5 评论 -
排序
定义:将一组杂乱无章的数据按一定规律顺次排列起来目的:便于查找内部排序:若待排序都在内存中,则称为内部排序外部排序:若待排序记录一部分在内存,一部分在外存,则称为外部排序。注意:外部排序时,要将数据分批调入内存来排序,中间结果还要及时放入外存,显然外部排序要复杂得多。排序算法的好坏如何衡量?时间效率—–排序速度(比较次数与移动次数)空间效率—–占内存辅助空间的大小稳定性——A和B的关键字相等,排序后原创 2016-03-14 13:30:16 · 1364 阅读 · 0 评论 -
插入排序
基本思想每趟将一个待排序的对象,按其关键码大小,插入到前面已经排序好的一组对象的适当位置 上,直到对象全部插入为止。即边插入边排序,保证子序列中随时都是排好序的插入排序算法的分类直接插入排序折半插入排序希尔排序直接插入排序排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。 void InsertS原创 2016-03-14 18:37:23 · 1760 阅读 · 0 评论 -
冒泡排序
交换排序基本思想:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。两种方法:起泡排序O(n*n)快速排序O(nlog2n)冒泡排序基本思想:每趟不断将记录两两比较,并按“前小后大”规则交换优点:每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;一旦下趟没有交换,还可以提前结束排序int main(int argc, const char * argv[]) {in原创 2016-03-15 14:26:40 · 2612 阅读 · 0 评论 -
小菜一步一步学数据结构之(三)线性表的顺序存储结构
线性表的定义和特点有n(n≥0)个数据特性相同的元素构成的有序序列称为线性表。当个数n(n≥0)定于为线性表的长度,n=0时成为空表。特点:只有一个首结点和尾结点;除首尾结点外,其他结点只有一个直接前驱和一个直接后继。分析26个英文字母组成的英文表(A,B,C,D,…..,Z)数据元素都是字母,元素间关系是线性抽象数据类型的定义为:ADT List{ 数据对象:D={ai|ai∈ElemSe原创 2016-01-13 15:34:15 · 1341 阅读 · 0 评论 -
小菜一步一步学数据结构之(四)单链表
上一篇博客学习了顺序表,最后也说明了顺序表属于静态存储,数据元素的个数不能自由的扩充。为了解决这个问题我们引入了链表链表存储结构结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻,因此线性表的链式表示又称为非顺序映像或链式映像。各个结点有两个域组成: * 数据域:存储元素数值数据 * 指针域:存储直接后继结点的存储位置 名词解析 1. 结点:数据元素的存储映像。有数据域和原创 2016-01-16 15:56:09 · 1827 阅读 · 0 评论 -
图
图:Graph=(V,E)V:顶点(数据元素)的有穷非空集合; E:边的有穷集合。 有向图 无向图无向图:每条边都是无方向的有向图:每条边都是有方向的完全图:任意两个点都有一条边相连稀疏图:有很少边或弧的图。稠密图:有较多边或弧的图。权与网图中边或弧所具有的相关数称为权,表明从一个顶点到另一个顶点的距离或耗费。带权的图称为网。邻接:有原创 2016-03-09 11:20:30 · 927 阅读 · 0 评论 -
赫夫曼树
赫夫曼树又称最优树,是一类带权路径长度最短的树。路径:由一结点到另一结点间的分支所构成路径长度:路径上的分支数目 例如上面的a->e的路径长度=2带权路径长度:结点到根的路径长度与结点上权的乘积树的带权路径长度:结点到根的路径长度与结点上权的乘积赫夫曼树:带权路径长度最小的树 上面这个图的树的值为WPL=7*2+5*2+2*2+4*2=36赫夫曼树构造过程基本思想:使权大的结点靠近根 操作要原创 2016-03-08 21:24:05 · 2271 阅读 · 1 评论 -
小菜一步一步学数据结构之(六)队列
队列是一种先进先出的线性表,它只允许在表的一段进行插入,而在另外一端删除元素。 队列的顺序表示—用一维数组base[M] #define M 100//最大队列长度 Typedef struct{ QElemType *base; int front; int rear; }SqQu原创 2016-01-26 11:31:09 · 1142 阅读 · 0 评论 -
小菜一步一步学数据结构之(二)算法和算法分析
一次数学课上,老师让学生练习算数。于是让他们一个小时内算出1+2+3+4+5+6+……+100的得数。全班只有高斯用了不到20分钟给出了答案,因为他想到了用(1+100)+(2+99)+(3+98)……+(50+51)…………一共有50个101,所以50×101就是1加到一百的得数。后来人们把这种简便算法称作高斯算法。算法定义:一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列算法的描原创 2016-01-12 13:15:22 · 1258 阅读 · 0 评论 -
串
串(String)—–零个或多个字符组成的有限序列 a="beijinghuanyingni"b="beijinghuanying"c="beijin"d=""子串:串中任意个连续的字符组成的子序列称为该串的子串。 比如上面的b是a的子串、c是a或者b的子串。 空串:零个字符的串。注意是”“而不是” “。空串是任意串的子串,任意串是其自身的子串。 串的抽象数据类型 ADT Stri原创 2016-03-01 20:26:52 · 1421 阅读 · 0 评论 -
快速排序
针对冒泡排序我们进行一次优化,就引进了快速排序在此基础上进行优化基本思想:任取一个记录(如第一个)作为 枢轴或支点,设其关键字为pivotkey。在一趟排序后,所有比它小的记录一律前放,比它大的记录一律后放,形成左右两个子表,将枢轴放在分界处的位置;然后,分别对各子表重新选择枢轴,并依此规则调整,直到每个子表的元素只剩一个,排序完成。具体操作(1)附设两个指针low和high,初始时分别指向原创 2016-03-16 20:28:34 · 1811 阅读 · 0 评论 -
简单选择排序
简单选择排序也叫作直接选择排序基本思想:每一趟在后面n-i+1个中选出关键字最小的记录,作为有序序列的第i个记录(1)设待排序的记录存放在数组r[1…n ]中,第一趟从r[1]开始,通过n-1次比较,从n个记录中选出关键字最小的记录,记为r[k],交换r[1]和r[k].(2)第二趟从r[2]开始,通过n-2次比较,从n-1个记录中选出关键字最小的记录,记为r[k],交换r[1]和r[k]。(3)原创 2016-03-16 21:24:03 · 2122 阅读 · 0 评论 -
归并排序
归并:将两个或两个以上的有序表组合成一个新的有序表2-路 归并排序排序过程初始序列看成n个有序子序列,每个子序列长度为1两两合并,得到n/2个长度为2或1的有序子序列再两两合并,重复直至得到一个长度为n的有序序列为止 void Merge(RedType R[],RedType &T[],int low,int mid,int high) { i=low;j=m原创 2016-03-17 18:30:42 · 1534 阅读 · 0 评论 -
树与二叉树(一)
树定义 树是n(n≥0)个结点的有限集,它或为空树(n=0),或为非空树非空树T满足以下条件:(1) 有且仅有一个称为根的结点;(2)除根结点以外的其余结点可分为m(m>0)个互补相交的有限集T1,T2,…Tm,其中每一个集合本身又是一棵树,并且称为根的子树。 空树 一般的树基本术语根———即原创 2016-03-05 20:21:25 · 3760 阅读 · 1 评论 -
树、二叉树(二)
限于篇幅过长上一篇我们只谈了树、二叉树(一)比较基础的认识,下面我们深入的学习树与二叉树。顺序存储结构 使用一组地址(一维数组)连续的存储单元来存储数据元素 //-------二叉树的顺序存储表示--------- #define MAXTSIZE 100 //二叉树的最大结点数 typedef TElemType SqBiTree[MAXTSIZE]; SqB原创 2016-03-08 17:52:58 · 1693 阅读 · 0 评论 -
小菜一步一步学数据结构之(五)顺序栈
定义只能在表的一端(栈顶)进行插入和删除运算的线性表逻辑结构一对一关系存储结构用顺序栈或链栈存储均可,但以顺序栈更常见 运算规则只能从栈顶运算,且访问结点时依照后进先出(LIFO)或后进后出(FILO)的原则实现方法关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同基本操作入栈出栈读栈顶元素值建栈判断栈满栈空栈与一般线性表的区别栈是一种特殊的线性表,它只能在表的一端(栈顶)原创 2016-01-17 19:38:49 · 1472 阅读 · 0 评论