数据结构
文章平均质量分 67
若海音符
愿每一份努力都被赏识!
展开
-
快速排序一次排序的应用
1.将数组中的大写字母与小写字母分开例子:一个数组中存储有且仅有大写和小写字母,编写一个函数对数组内的字母重新排列,让小写字母在大写字母之前#include#includeusing namespace std;//判断是否为大写字母 bool isUpper(char a){ if(a>='A' && a<='Z') return true; return fals原创 2016-08-13 17:55:00 · 894 阅读 · 0 评论 -
堆排序
1,。将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走,其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值。然后再将剩余的n-1个序列重新构建一个堆。这样就会得到n个元素中次大值。如此仿佛执行,便能得到一个有序的序列2.时间复杂度O(nlongn),由于记录的比较与交换是跳跃式进行,因此堆排序也是一种不稳定的排序算法。初始构建堆所需要的比较次数较多,因此原创 2016-05-03 19:03:45 · 393 阅读 · 0 评论 -
希尔排序
时间复杂度O(n2),空间复杂度O(1)不稳定#includeusing namespace std;//希尔排序void ShellSort(int *num, int len){ int dk,i,j; for(dk=len/2; dk>=1; dk/=2){ for(i=dk; i<len; i++){ if(num[i]<num[i-dk]){原创 2016-04-07 20:58:47 · 361 阅读 · 0 评论 -
各个排序算法的总结
1.根据在排序的过程中,待排序的所有记录全部被放置在内存中,排序分为内排序和外排序。 内排序是在排序的整个过程中,带排序的所有记录全部放置在内存中。外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。2.内排序的分类.3从算法的简单性来划分简单算法:冒泡、简单选择、直接插入改进算法:快排、堆排序、希尔排序、归并排序原创 2016-05-16 15:33:51 · 293 阅读 · 0 评论 -
循环链表双向链表
单链表:将单链表中的终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾想接的单链表称为单循环链表,简称循环链表。其实循环链表和单链表的主要差异在于循环的判断条件上,原来是判断p->next是否为空,现在则是判断p->next是否等于头结点,则表示循环结束改造单链表,不用头指针,而是用指向终端结点的尾指针来表示循环链表,此时查找结束结点和头结点都很方便。将两个循环原创 2016-04-19 22:16:52 · 368 阅读 · 0 评论 -
静态链表
用数组描述的链表叫做静态链表优点:在插入和删除的时候,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点缺点:没有解决连续存储分配带来的表长难以确定的问题,失去了顺序表存储结构随机存取的特性#include "string.h"#include "ctype.h" #include "stdio.h" #includ原创 2016-04-19 21:50:04 · 346 阅读 · 0 评论 -
线性表
1.线性表:零个或多个数据元素的有限序列2,线性存储定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。既然线性表的每一个数据元素的类型都相同,所以可以用一维数组来实现顺序存储结构。顺讯存储结构有三个属性:存储空间的起始位置,线性表的最大存储量,线性表的当前的长度3.数组的长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。线性表的长度是线性表中原创 2016-04-19 13:59:54 · 374 阅读 · 0 评论 -
树,森林与二叉树的转换
1.树转换为二叉树树中每个节点最多只有一个最左边的孩子(长子)和一个右邻的兄弟 1)在所有兄弟节点之间加一连线 2)每个节点,除了保留与其长子之间的连线外,去掉该节点与其它孩子的连线3)层次调整。以树根点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。这样结点的左孩子还是之前的左孩子,右孩子是之前的兄弟结点2.森林转化为二叉树1)把每棵树转换为二叉树。2原创 2016-04-26 10:21:09 · 1030 阅读 · 0 评论 -
快速排序
#includeusing namespace std;int Partition(int *num,int low,int high){ int pivot=num[low]; while(low<high){ while(low=pivot) high--; num[low]=num[high]; while(low<high && num[low]<=pivot原创 2016-04-07 21:39:25 · 314 阅读 · 0 评论 -
归并排序
时间复杂度:O(nlogn)由于归并排序过程中,需要与原始记录序列相同数量的存储空间存放归并结果以及递归的深度为logn的栈的空间,因此空间复杂度为O(n+longn)归并排序是一种比较占内存,但是效率高且稳定的排序算法/* 归并排序********************************** *//* 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..原创 2016-05-03 20:14:43 · 304 阅读 · 0 评论 -
归并排序
时间复杂度:O(nlogn)由于归并排序过程中,需要与原始记录序列相同数量的存储空间存放归并结果以及递归的深度为logn的栈的空间,因此空间复杂度为O(n+longn)归并排序是一种比较占内存,但是效率高且稳定的排序算法#includeusing namespace std;const int MAX=100;void Merge(int *src,int start,int原创 2016-05-16 21:49:29 · 305 阅读 · 0 评论 -
有序表查找(二分查找,插值查找,斐波那契查找)
1.二分查找//二分查找非递归 int Binary_Search1(int *num, int len,int target){ int low=0,hight=len-1,mid; while(low<=hight){ mid=(low+hight)/2; if(num[mid]==target) return mid; else if(num[mid]>targe原创 2016-05-17 20:18:19 · 643 阅读 · 0 评论 -
原地归并排序
原地归并排序原地归并排序不需要辅助数组既可以归并。关键在于merge函数。假设有两段递增的子数组arr[begin...mid-1]和arr[mid..end].但是整个数组不是递增的。其中i=begin,j=mid,k=end第一步:i往后移动,找到第一个arr[i]>arr[j]的索引,假设数组元素如下图所示,图中arr[i]=2,则i经过此步骤之后指向arr[5]原创 2016-08-10 12:51:36 · 605 阅读 · 0 评论 -
树的存储结构
1.双亲表示法 在每一个结点中,附设一个指示器指示双亲在数组中位置。2.孩子表示法 使用多重链表。每一个结点有多个指针域,其中每一个指针指向一棵子树的根结点,我们把这种方法叫做多重链表法。把每一个结点的孩子结点排列起来,以单链表做存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中3.孩子兄弟原创 2016-04-24 22:16:26 · 303 阅读 · 0 评论 -
树
1.树的定义:树(tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空的树: (1)有且仅有一个特定的称为根root的结点 (2)n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,....Tm,其中每一个集合本身又是一棵树,并且成为根的子树subtree2.结点分类 结点拥有的子树数称为结点的度。度为0的结点称为叶结原创 2016-04-24 21:47:16 · 308 阅读 · 0 评论 -
串
1.串(string)是由零个或多个字符组成的有限序列2.子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串。相应的,包含子串的串称为主串。3.KMP#includeusing namespace std;void nextArray(int *next,string pattern){ next[0]=-1; int j=0,k=-1; int len=pat原创 2016-04-24 20:51:27 · 342 阅读 · 0 评论 -
栈的顺序存储结构
1.队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表2.队列是一种先进先出FIFO的线性表。3.循环队列,我们把队列的这种头尾相接的顺序存储结构称作循环队列 rear==font,队列为空 当队列满的时候,我们修改其条件,保留一个空元素,所以此时队列满的条件是(rear+1)%QueueSize==font; 队里的长度:(rear-font+Q原创 2016-04-24 11:49:10 · 342 阅读 · 0 评论 -
栈的运用-四则运算表达式求值
分为两步1.将中缀表达式转化为后缀表达式(栈用来进出运算的符号)规则:从左到右遍历中缀表达式中的每一个数字和符号,若是数字就直接输出,即成为后缀表达式的一部分;若是符号,则判断其余栈顶的符号的优先级,是右括号或者优先级不高于栈顶符号的优先级,则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式string middleToLast(string middle){ st原创 2016-04-24 11:10:20 · 503 阅读 · 0 评论 -
栈的运用
1.在程序设计语言中实现了递归。我们把一个直接用自己或者通过一系列的调用语句间接调用自己的函数,称作递归函数。写递归程序最怕的就是陷入用不结束的无穷递归中。所以,每一个递归定义至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。2.递归和迭代的区别迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结构更加清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的原创 2016-04-22 21:36:13 · 373 阅读 · 0 评论 -
栈的链式存储结构及实现
栈的链式存储结构,简称链栈1.链栈不需要头结点。空的链栈就是top==null2.对比一下顺序栈与链栈,它们在时间复杂度上是一样的,均为O(1)。对于空间性能,顺序栈需要实现确定一个固定的长度,可能会存在内存空间浪费的问题,但它的优势是存取时定位比较方便,而链栈则要求每个元素都要有指针域,这同时也增加了一些内存开销,但对栈的长度没有限制。如果栈的使用过程中元素变化不可预料,又是很小,有时非原创 2016-04-22 21:10:31 · 587 阅读 · 0 评论 -
栈的顺序存储结构
1.栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表。把允许插入和删除的一端称为栈顶,另一端称为栈底,不包含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。自定义栈:#includeusing namespace std;const int MAX_SIZE=20;typedef struct { int data[MAX_SIZE]; int原创 2016-04-22 20:46:29 · 437 阅读 · 0 评论 -
算法
1.算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每一条指令表示一个或多个操作2.算法有5个基本特性:输入、输出、有穷性、确定性和可行性 输入和输出:算法具有零个或多个输入,至少有一个或多个输出,输出形式可以是打印输出也可以是返回 有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。又穷的概念和数学上的原创 2016-04-19 11:53:51 · 357 阅读 · 0 评论 -
数据结构绪论
1.数据结构是相互之间存在一种或多种特定关系的数据元素的集合2.数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科3.数据的概念:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。(可以看出数据有两个前提:可以输入计算机中,能被计算机程序处理)4.数据元素:是组成数据的、有一定意义的基本单位,在原创 2016-04-19 10:33:51 · 340 阅读 · 0 评论 -
深度优先搜索DFS
例题引入DescriptionI am a traveler. I want to post a letter to Merlin. But because there are so many roads I can walk through, and maybe I can’t go to Merlin’s house following these roads, I must原创 2016-04-29 22:08:01 · 381 阅读 · 0 评论 -
图的存储结构-邻接表
#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXVEX 100 /* 最大顶点数,应由用户定义 */原创 2016-04-29 20:28:41 · 466 阅读 · 0 评论 -
图的存储结构-邻接矩阵
1.图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中的顶点信息,一个一维数组存储图中的边或者弧的信息2.邻接矩阵的实现#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1#define ERROR原创 2016-04-29 19:16:43 · 589 阅读 · 0 评论 -
图(graph)
1.图的定义:图graph是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中。G表示一个图,V表示图中顶点的集合,E是图中边的集合2.在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。而图,任意两个原创 2016-04-26 21:01:08 · 986 阅读 · 0 评论 -
树和森林的遍历
树和森林的遍历树的遍历 设树T如下图所示,结点R是根,根的子树从左到右依次为T1,T2,…,Tk。 1.树T的前序遍历定义: 若树T非空,则: ①访问根结点R; ②依次前序遍历根R的各子树T1,T2,…,Tk。2.树的后序遍历定义: 若树T非空,则: ①依次后序遍历根T的各子树Tl,T2,…,Tk; ②原创 2016-04-26 11:37:35 · 3568 阅读 · 0 评论 -
Huffman编码
1.从树中一个结点到另外一个结点之间分支构成两个结点之间的路径,是、路径上的分支数目叫做路径长度2.树的路径长度就是从树根到每一个结点的路径长度之和3.带权路径长度WPL最小的二叉树称作赫夫曼树4.若要设计长短不等的编码,则必须是任一字符的编码的前缀,这种编码称为前缀编码5.一般地,设需要编码的字符集为{d1,d2,...,dn},各个字符在电文中出现的次数或频率集合为{w1,w2原创 2016-04-26 09:59:17 · 690 阅读 · 0 评论 -
二叉树——后序和中序得到前序
二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。举个例子,中序遍历HKDBEAIFCGJ后序遍历KHDEBIFJGCA首先原创 2016-04-25 20:38:14 · 907 阅读 · 0 评论 -
二叉树的基本操作
1.二叉树的建立2.二叉树的前序遍历的递归形式3.二叉树的前序遍历的非递归形式4.二叉树的中序遍历的递归形式5.二叉树的中序遍历的非递归形式6.二叉树的后序遍历的递归形式7.二叉树的后序遍历的非递归形式8.二叉树的深度#include#include#include#includeusing namespace std;const in原创 2016-04-25 19:41:33 · 907 阅读 · 3 评论 -
二叉树——前序和中序得到后序
二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10首先,5肯原创 2016-04-25 20:19:04 · 772 阅读 · 0 评论 -
广度优先搜索
130. Surrounded Regions Total Accepted: 52330 Total Submissions: 324643 Difficulty: MediumGiven a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.A region is原创 2016-05-01 12:28:17 · 421 阅读 · 0 评论 -
leetcode-133. Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.Clone an undirected graph. Each node in the graph contains a label and a list of its neighbor原创 2016-05-01 15:17:03 · 503 阅读 · 0 评论 -
插入排序
#includeusing namespace std;//插入排序void InsertSort(int *num, int len){ int i,j; for(i=1; i<len; i++){//依次将num1-(n-1)插入到前面已经排序好的队列中 if(num[i]<num[i-1]){//若当前的数据小于前去,插入到前面的排序中 int temp=num[原创 2016-04-07 20:23:50 · 325 阅读 · 0 评论 -
选择排序
选择排序我就从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。时间复杂度O(n*n),空间复杂度O(1);#includeusing namespace std;//选择排序void SelectSort(int *num, int len){ int原创 2016-04-07 21:12:44 · 246 阅读 · 0 评论 -
冒泡排序
时间复杂度O(n2),空间复杂度O(1),稳定的排序算法#includeusing namespace std;//正宗的冒泡排序 void BubbleSort(int *num,int len){ for(int i=0;i<len;i++){ for(int j=len-2;j>=i;j--){ if(num[j]>num[j+1]){//若前者大于后者原创 2016-05-02 20:17:42 · 351 阅读 · 0 评论 -
排序
1.排序的稳定性 假设Ki=Kj(02.内排序和外排序根据在排序的过程中,待排序的所有记录全部被放置在内存中。外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行3.排序算法的性能主要受3个方面影响 1)时间性能:尽可能少的关键字比较次数和尽可能少的记录移动次数 2)辅助空间 3)算法的复杂性原创 2016-05-02 20:00:20 · 370 阅读 · 0 评论 -
拓扑排序
1424. 奖金ConstraintsTime Limit: 1 secs, Memory Limit: 32 MB Description 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。 于是Mr.Z下令召开m方会谈。原创 2016-05-02 16:51:57 · 575 阅读 · 0 评论 -
最短路径-Dijkstra
1031. CampusConstraintsTime Limit: 1 secs, Memory Limit: 32 MB DescriptionAt present, Zhongshan University has 4 campuses with a total area of 6.17 square kilometers sitting respectively on原创 2016-05-02 15:17:26 · 366 阅读 · 0 评论