数据结构与算法
文章平均质量分 53
bug_lover_liao
逐梦北京实习中。。。
展开
-
C语言实现单链表的逆转指定个数个元素
如有以下的链表 1-->2-->3-->4-->NULL,指定逆转前2个元素变为:2-->1-->3-->4实现的代码如下(C语言):#include#includetypedef struct Node{ int data; struct Node * next;}Node;Node * createLink() // 创建带头节点的单链表{ Node *hea原创 2016-10-31 21:08:40 · 1115 阅读 · 0 评论 -
手写快速排序
快速排序简介快速排序是一种很不错的排序算法,算法复杂度为n*logn。快排使用了分而治之的思想,每次排序是都找到一个基准(我们学习时经常使用第一个作为基准),然后把小于基准的元素放到基准元素的左边,大于基准的元素放到基准元素的右边,这样一次排序下来,基准元素左边都是小于(等于)基准的数,基准右边的元素都是大于(等于)基准的元素了。快速排序关键点就是找到这样一个基准并将其放到恰到的位置。算法思路定义一原创 2017-09-25 20:34:21 · 10259 阅读 · 2 评论 -
手写最大堆(Java实现)
最大堆最大堆和最小堆是二叉堆的两种形式。 最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。最大堆的父元素与子元素的索引有如下关系在最大堆中,设根节点索引从1开始,当父节点索引为i时,左孩子节点2*i , 右孩子索引2*i+1。实现最大堆定义最大堆的数据结构和构造函数 堆中数据的存储我们原创 2017-10-09 21:23:51 · 4867 阅读 · 1 评论 -
一个没有bug的二分查找算法
二分查找算法 //二分查找要针对顺序数组 public static int search(int arr[],int value){ int l = 0,r = arr.length; while(l<=r){ //这样求得的mid值就不会出现溢出的问题,若写成int mid = (l + r) / 2;可能出现溢出原创 2017-10-09 21:01:00 · 714 阅读 · 0 评论 -
手写二叉搜索树(Java实现)
二叉搜索树的概念二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树的代码实现定义二叉搜索树的数据结构及基本方法 //定义树节点public clas原创 2017-10-09 20:45:57 · 1956 阅读 · 0 评论 -
图解归并排序
图解归并排序原创 2017-09-19 10:22:16 · 3249 阅读 · 0 评论 -
排序大法之归并排序
归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间原创 2016-12-17 20:20:57 · 372 阅读 · 0 评论 -
排序大法之希尔排序
希尔排序的基础为插入排序,首先理一下插入排序的思路:插入排序核心代码思想:void insert_sort(int a[],int n){ int i,j; for(i = 1; i < n; i++) // 从第二个元素开始标,进行n-1次循环 { int tmp = a[i]; //将这个元素赋值给tmp for(j = i; j > 0 && a[j-1] >原创 2016-12-17 15:26:16 · 386 阅读 · 0 评论 -
多源最短路径Floyd算法
设d[i][j]为顶点 i 与顶点 j 的最短路径,设 k为i与j之间的点,那么d[i][j] = d[i][k] + d[k][j];算法核心为: void floyd(){ int i,j,k; for(k = 1; k <= n; k++) { for(i = 1; i <= n; i++) { for原创 2016-11-27 19:58:44 · 438 阅读 · 0 评论 -
图的基本操作之构造图(邻接表)
/* 邻接表构造图的数据结构*/#include#includeusing namespace std;#define MaxVertexNum 20typedef struct node //边表结点{ int index; //节点的索引 node * next; //下一个节点地址 int weight; // 与顶点节点的权值(这里没用)}EdgeNode原创 2016-11-24 17:27:17 · 2807 阅读 · 0 评论 -
欧拉回路(欧拉路径)
欧拉通路: 通过图中每条边且只通过一次,并且经过每一顶点的通路。欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路。一:无向图是否具有欧拉通路或回路的判定:欧拉通路:图连通;图中只有0个或2个度为奇数的节点欧拉回路:图连通;图中所有节点度均为偶数二:有向图是否具有欧拉通路或回路的判定:欧拉通路:图连通;除2个端点外其余节点入度=出度;原创 2016-12-06 17:24:21 · 818 阅读 · 0 评论 -
图的遍历之深度优先遍历
思路:定义一个递归函数DFS,从源点开始进入DFS,每碰到当前未访问过的点就进入DFS,直到所有点都访问完示例代码:/*无向图的深度优先遍历*/#include#define N 1001using namespace std;int visited[N];int n,m;int G[N][N];void dfs(int x){ int i; visited[x]原创 2016-12-06 09:06:37 · 430 阅读 · 0 评论 -
最小生成树算法之prim算法
prim算法从找点开始的算法,对于一个图如下:解释:dist[]为每个点到生成树的最小距离,最开始时候每个点到生成树的最小距离为INF(无穷大),邻接矩阵g[][]来存储图的边数据,不相邻的边距离为INF,每个点到自己的距离为0,visited[]数组来标记每个点是否被访问了1、刚开始时,最小生成树为空,若取顶点1位源点,则把顶点1加入到生成树中去,设置visited数组visit原创 2016-11-28 15:19:08 · 389 阅读 · 0 评论 -
最小生成树之Kruskal算法
Kruskal算法的基本思想:1、先将图中的边按照权值(边长)从小到大排序2、从排好序的边集合中每次选取一条边,只要选取的边不会构成回路就选择此边3、重复2直到遍历完所有边用一个数组T[N]表示每个顶点的父节点,初始化T[i] = -1 。 每次选择边的时候讲其中一个顶点的父节点设为边的另一顶点。使用递归函数压缩使每个顶点直接指向父节点,优化查询过程。若新加入边的两个顶点的父节点一原创 2016-11-29 10:32:45 · 333 阅读 · 0 评论 -
堆与堆排序
堆堆是计算机科学中一类特殊的数据结构的统称。堆可以被看出是一个近似的完全二叉树,一般使用数组去存储堆数据。如何去构造一个堆(以最大堆为例)?1、定义一个堆的数据结构 private int data[]; private int size; private int capacity;data用来存储数据,size是堆中元素的个数,capacity是堆的最大容量2、存储堆的数据堆中...原创 2018-04-09 14:23:24 · 255 阅读 · 0 评论