数据结构
文章平均质量分 77
HAN-Kai
这个作者很懒,什么都没留下…
展开
-
图的邻接表存储结构
与邻接矩阵对比如下:代码:#includeusing namespace std;typedef char VertexType;//顶点数据类型typedef int EdgeType;//边上的权值数据类型 const int MAXVEX = 100;//最大顶点数 const int INFINITY = 65535;//代表无穷大 typedef struct原创 2013-03-04 16:48:36 · 1691 阅读 · 0 评论 -
冒泡排序(BubbleSort)
冒泡排序是一种交换排序,它的基本思想是:两两比较相信记录的关键字,如果反序则交换,直到没有反序的记录为止。时间复杂度为O(n)。#include using namespace std;void Swap(int *L, int i, int j){ int temp = L[i]; L[i] = L[j]; L[j] = temp;}void Bubble原创 2013-03-08 12:33:53 · 908 阅读 · 0 评论 -
简单选择排序(Simple Selection Sort)
简单选择排序就是通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1代码如下:#include using namespace std;void Swap(int *L, int i, int j){ int temp = L[i]; L[i] = L[j]; L[j] = temp;}void SelectSort(int *L原创 2013-03-08 13:16:30 · 1155 阅读 · 0 评论 -
快速排序(Quick Sort)
快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。#include using namespace std;void Swap(int *L, int i, int j) { int temp = L[i]; L[i] = L[j];原创 2013-03-08 20:14:44 · 1144 阅读 · 0 评论 -
直接插入排序(Straight Insertion Sort)
直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。#include using namespace std;/************************************************************************//* 设数组为a[0…n-1]。1. 初始时,a[0]自成1个有原创 2013-03-08 13:52:52 · 880 阅读 · 0 评论 -
希尔排序(Shell Sort)
希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前的排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一。基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基原创 2013-03-08 14:52:44 · 745 阅读 · 0 评论 -
线性表La和线性表Lb合并
线性表La与Lb合并。输入:两个线性表La和Lb.过程:循环集合B中的每个元素,判断当前元素是否存在A中,若不存在,则插入到A中即可。输出:合并后的线性表La。代码如下#includeusing namespace std;#define MAXSIZE 100#define ElemType inttypedef struct{ ElemType Data[原创 2013-02-27 09:35:56 · 7394 阅读 · 2 评论 -
线性表的顺序存储结构
线性表的顺序存储结构用一维数据实现。优点:1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间2.可以快速地存取表中任意位置的元素缺点:1.插入和删除操作需要移动大量的元素。2.当线性表长度变化较大时,难以确定存储空间的容量。3.造成存储空间的“碎片”#includeusing namespace std;const int MAXSIZE原创 2013-02-27 10:40:12 · 758 阅读 · 0 评论 -
栈的顺序存储结构
栈是线性表的特例,所以和线性表一样有顺序存储和链式存储。其线性存储是线性表顺序存储的简化。下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它做栈底。#includeusing namespace std;const int MAXSIZE = 100;const int OK = 1;const int ERROR =0;typedef int Sta原创 2013-02-27 16:22:54 · 709 阅读 · 0 评论 -
队列的链式存储结构
#include#include "stdio.h" using namespace std;const int MAXSIZE = 20; const int OK = 1; const int ERROR =0; typedef int Status; typedef int ElemType; typedef struct QNode{原创 2013-02-28 16:29:48 · 771 阅读 · 0 评论 -
队列的顺序存储结构
队列是一种先进先出(First In First Out)的线性表,简称FIFO。在队尾进行插入(front),在队头进行删除(rear)。以下以一个循环队列为例进行实现。循环队列空的条件是front == rear,当队列满时,保留一个元素空间,则队列满的条件是(rear+1)%MAXSIZE == front;如上图、下图所示。#includeusing name原创 2013-02-28 14:25:00 · 1871 阅读 · 0 评论 -
栈的链式存储结构
对于链栈来说,通常是不需要头结点的。结构图如下#includeusing namespace std; const int MAXSIZE = 100; const int OK = 1; const int ERROR =0; typedef int Status; typedef int ElemType; typedef struct Stack原创 2013-02-27 21:37:40 · 607 阅读 · 0 评论 -
线性表的链式存储(链表)
线性表的顺序存储结构最大的缺点是:插入和删除时需要移动大量的元素,这显然需要耗费时间,链式存储结构解决这个问题。#includeusing namespace std;typedef int ElemType;const int OK = 1;const int ERROR =0;const int TRUE = 1;const int Flase =0;typede原创 2013-02-27 15:08:13 · 732 阅读 · 0 评论 -
朴素字符串匹配
子串的定位操作通常被称做串的模式匹配。#includeusing namespace std;/*返回子串t在主串s第pos个位置之后的位置,若不存在,返回-1*/int Index(char *s,char *t,int pos){ int len_s = strlen(s); int len_t = strlen(t); int i = pos;//i指示主原创 2013-03-01 10:19:30 · 554 阅读 · 0 评论 -
二叉树的链式存储结构
对于二叉树,顺序存储结构一般只用于完全二叉树。#includeusing namespace std;typedef char ElemType;typedef struct BiNode{ ElemType data; BiNode *lchild,*rchild;}BiNode,*BiTree;int index = 0;char node[10]="AB#原创 2013-03-01 15:55:26 · 4246 阅读 · 0 评论 -
归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void MemeryA转载 2013-03-08 19:23:27 · 767 阅读 · 0 评论 -
堆排序(Heap Sort)
堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。如此反复执行,便能得到一个有序序列了。代码如下:#include using namespace std;原创 2013-03-08 16:59:51 · 816 阅读 · 0 评论 -
深度优先遍历(搜索)(DFS)
深度优先遍历(Depth_First_Search),也称为深度优先搜索,简称DFS。无向图无向图对应的邻接矩阵深度优先遍历其实就是一个递归的过程,像一棵树的前序遍历。它从图中某个顶点v出发,访问此顶点,然后从v的未访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。事实上,这里指的是连通图,对于非连通图,只需要对它的连通分量分别进行深度原创 2013-03-05 11:26:58 · 1660 阅读 · 0 评论 -
克鲁斯卡尔(Kruskal)算法求解最小生成树
算法描述:假设N=(V,{E})是连通网,则令最小生成树的初始状态为只有n个顶点而无边的非连通图T{V,{}},图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依次类推,直到T中所有顶点都在同一连通分量上为止。代码如下:#include "stdio.h" #inclu原创 2013-03-05 19:33:54 · 2366 阅读 · 0 评论 -
弗洛伊德(Floyd)算法求解图的最短路径
弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径。时间复杂度为O(n^3).正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,转载 2013-03-05 21:24:16 · 2642 阅读 · 1 评论 -
迪杰斯特拉(Dijkstra)算法求图的最短路径
通过Dijkstra算法解决了从某个源点到其余各顶点的最短路径问题。时间复杂度为o(n^2)。代码如下:#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1#define ERROR 0#define原创 2013-03-05 21:01:47 · 3463 阅读 · 1 评论 -
广度优先遍历(搜索)(BFS)
如果说图的深度优先搜索类似树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历。以下是邻接矩阵存储方式的图的BFS操作。#include#includeusing namespace std;typedef char VertexType;//顶点数据类型typedef int EdgeType;//边上的权值数据类型 const int MAXVEX = 1原创 2013-03-05 14:30:10 · 1171 阅读 · 0 评论 -
普里姆(Prim)算法求解最小生成树
我们把构造连通网的最小代价生成树称为最小生成树。Prim算法:假设N=(P,{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0} (u0∈V),TE={}开始。重复执行下述操作:在所有的u∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。代码原创 2013-03-05 18:40:31 · 1940 阅读 · 0 评论 -
有序表查找_斐波那契(Fibonacci)查找
斐波那契查找算法的的核心在于:1)当key = a[mid]时,查找成功;2)当key 3)当key > a[mid]时,新范围是第m+1个到第high个,此时范围个数为F[k-2]-1个。时间复杂度是O(logn),但就平均性能来说,斐波那契查找要优于折半查找。可惜如果是最坏情况,比如下例中key = 1,那么始终都处于左侧长半区在查找,则查找效率要低于折半查找。代码如下原创 2013-03-06 14:29:13 · 1464 阅读 · 0 评论 -
有序表查找_插值查找
为什么一定要二查找,而不是四分之一或者更多呢?插值查找(Interpolation Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式。插值查找时间复杂度O(logn)。对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好得多。反之,数组中如果分布极端不均匀,用插值查找则未必合原创 2013-03-06 11:26:43 · 1449 阅读 · 0 评论 -
顺序表查找
顺序表查找算法#include using namespace std;/************************************************************************//* 顺序查找,a为数据,n为数据大小,key为目标关键字 *//****************************原创 2013-03-06 10:09:45 · 1521 阅读 · 0 评论 -
有序表查找_折半查找(二分查找)
二分查找前提是线性表中的记录初始有序。时间复杂度O(logn)代码如下:#include using namespace std;int Binary_Search(int *a, int n, int key){ int mid = 0; int high = n-1; int low = 0; while (low <= high) { mid =原创 2013-03-06 10:34:14 · 4242 阅读 · 0 评论 -
平衡二叉树(AVL_Tree)
平衡二叉树,是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。 将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor)。 距离插入结点最近的,且平衡因子的绝对值大于1的节点为树根的子树,我们称为最小不平衡子树。 如果我们需要查找的集合本身没有顺序,在频繁查找的同时也需要经常的插入和删除操作,显然我们需要构建一棵二原创 2013-03-07 20:59:50 · 1000 阅读 · 0 评论 -
B树(多路查找树)
#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 MAXSIZE 100 /* 存储空间初始分配量 */原创 2013-03-07 21:06:02 · 936 阅读 · 0 评论 -
散列表(Hash Table)
#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 MAXSIZE 100 /* 存储空间初始分配量 */原创 2013-03-07 21:08:28 · 765 阅读 · 0 评论 -
二叉排序(查找)树
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2)若它的右子树不空,则右子上上所有结点的值均大于它的根结点的值;3)它的左、右子树也分别为二叉排序树。示例代码如下:#include "stdio.h" #include "stdlib.h"原创 2013-03-07 14:44:43 · 808 阅读 · 0 评论 -
图的邻接矩阵存储结构
图的存储可以用邻接表实现。无向图的邻接矩阵是对称的,而有向图则非对称。以下以无向图的邻接矩阵为例:#includeusing namespace std;typedef char VertexType;//顶点数据类型typedef int EdgeType;//边上的权值数据类型 const int MAXVEX = 100;//最大顶点数 const int INF原创 2013-03-04 11:05:45 · 2973 阅读 · 0 评论