数据结构与算法
文章平均质量分 78
早起的虫儿灬
这个作者很懒,什么都没留下…
展开
-
选择排序
//SelectionSort.h#ifndef _SELECTIONSORT_H_#define _SELECTIONSORT_H_#include #include #include #define SIZE 15typedef int Element;typedef Element ListType[SIZE];void CreateRandom(ListType原创 2017-06-06 20:35:35 · 252 阅读 · 0 评论 -
二叉树的创建与先、中、后序遍历递归实现
#include "LinkBinTree.h"int main(int argc, char **argv){ //const char *str = "ABC##DE##F##G#H##"; BinTree tree; InitBinTree(&tree, '#'); CreateBinTree_input(&tree); //CreateBinTree_read(&tree, str); PreOrder(tree); InOrder(tr原创 2017-04-14 08:05:33 · 720 阅读 · 0 评论 -
顺序队列
#ifndef _SEQQUEUE_H_#define _SEQQUEUE_H_#include #include #define MAXSIZE 8typedef int ElementType;typedef struct SeqQueue{ ElementType *base;原创 2017-04-01 00:02:59 · 294 阅读 · 0 评论 -
单循环链表
//SCList.h/*****************************************头插 尾插 显示 头删 尾删按值插入 按位置插入 查找 长度逆序 清除 摧毁 初始化 排序按位置删除 按值删除****************************************/#ifndef SCLIST_H_#define SCLIST原创 2017-03-21 00:10:35 · 341 阅读 · 0 评论 -
线性结构之单链表
//List.h/*****************************************头插 尾插 显示 头删 尾删 按值插入 按位置插入 查找 长度 逆序 清除 摧毁 初始化 排序按位置删除 按值删除****************************************/#ifndef LIST_H_#define LIST原创 2017-03-19 01:11:25 · 320 阅读 · 0 评论 -
线性结构之顺序表
//mian.c#include "MySeqList.h"#include #include int main(int argc, char **argv){ int s = 0, i = 0, r = 0; SeqList list; ElementType e; init(&list); while(1) { prin原创 2017-03-16 23:56:07 · 345 阅读 · 0 评论 -
二叉树非递归遍历之层次遍历,先序、中序遍历
//LinkBinTree.h#ifndef _LINKBINTREE_H_#define _LINKBINTREE_H_#include typedef char Element;typedef struct _BinTreeNode{ Element data; struct _BinTreeNode *leftChild; struct _BinTreeNode *r原创 2017-04-16 10:56:01 · 363 阅读 · 0 评论 -
grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
作者:Alexia(minmin)链接:http://www.cnblogs.com/lanxuezaipiao/p/3452579.html这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解这个算法,发现这个算法一开始还挺难理解的,转载 2017-06-11 10:57:49 · 350 阅读 · 0 评论 -
内存池技术
链接:https://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html本章首先简单介绍自定义内存池性能优化的原理,然后列举软件开发中常用的内存池的不同类型,并给出具体实现的实例。回页首6.1 自定义内存池性能优化的原理如前所述,读者已经了解到"堆"和"栈"的区别。而在编程实践中,不可避免地要转载 2017-06-09 22:28:28 · 249 阅读 · 0 评论 -
各种内部排序算法复杂度的比较和排序方法的选择
链接:http://blog.chinaunix.net/uid-26565142-id-3126683.html作者:printk1986选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n转载 2017-06-08 21:39:26 · 467 阅读 · 0 评论 -
定长字符串
//SString.h//字符串的定长顺序存储方式,数组内部存储以'\0'结尾的一串字符#ifndef _SSTRING_H_#define _SSTRING_H_#include #include #include #define STRINGLENGTH 20typedef unsigned char UCHAR;typedef UCHAR SString[STRI原创 2017-04-07 08:57:48 · 1891 阅读 · 0 评论 -
二叉树的一些方法
//LinkBinTree.h#ifndef _LINKBINTREE_H_#define _LINKBINTREE_H_#include typedef char Element;typedef struct _BinTreeNode{ Element data; struct _BinTreeNode *leftChild; struct _BinTreeNode *r原创 2017-04-17 22:23:26 · 493 阅读 · 0 评论 -
二叉树之恢复
先来一段不痛不痒的文:先复习一下二叉树的先、中、后序遍历的访问顺序(在节点存在的情况下):1、先序遍历(VLR) 根节点 -> 左孩子 -> 右孩子2、中序遍历(LVR) 左孩子 -> 根节点 -> 右孩子3、后序遍历(LRV) 左孩子 -> 右孩子 -> 根节点假设现在有一组先序遍历输出的字符序列const char *VLR = "ABCDEFGH";一组中序遍历输出的字符序列const char *LVR = "CBEDFAGH";一组后序遍历输出的字符序列const char *LR原创 2017-04-19 00:24:15 · 404 阅读 · 0 评论 -
交换排序
//SwapSort.h#ifndef _SWAPSORT_H_#define _SWAPSORT_H_#include #include #include #define SIZE 15typedef int Element;typedef Element ListType[SIZE];void CreateRandom(ListType List, int n);原创 2017-06-04 20:19:09 · 300 阅读 · 0 评论 -
哈希表
哈希表的结构是这样的//HashTable.h#ifndef _HASHTABLE_H_#define _HASHTABLE_H_#include <stdlib.h>#include <stdbool.h>#define BUCKET_SIZE 5 //基桶与溢出桶大小,此处的值表示可容纳5个元素#define HASHTABLE_SIZE 17 //哈希表中基桶个数,为了使得出的哈希因子在所有可得的值中得出任一值的概率相同,所以使用素数作为基桶个数#define原创 2017-05-26 22:46:19 · 469 阅读 · 0 评论 -
二叉搜索树
二叉搜索树是这样来的节点是这样删的//BST.h#ifndef _BST_H_#define _BST_H_/* *在二叉排序树中,当根的左右子树存在时,其左子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值 */#include <stdlib.h>#include <stdio.h>#include <stdbool.h>typedef int Elemenet;typedef struct _BST_Node{ Elemen原创 2017-04-27 00:27:43 · 332 阅读 · 0 评论 -
循坏队列
//CircularQueue.h/*******************************************************************顺序队列可能存在虚满的情况( 队尾元素后一位置下标到达MAXSIZE,队头元素下标不在0 ),于是出现了能处理这一缺陷的循环队列。循环队列要求队列在逻辑上能够循环,但计算机中的存储结构却是线性的,要实现逻辑上的循环需要原创 2017-04-01 00:05:03 · 374 阅读 · 0 评论 -
链栈
//LinkStack.h#ifndef LINKSTACK_H_#define LINKSTACK_H_#include typedef int ElementType;typedef struct StackNode{ ElementType data; struct StackNode *next;}StackNode;typedef StackNode *L原创 2017-03-29 21:53:40 · 298 阅读 · 0 评论 -
顺序栈
//SeqStack.h#ifndef _SEQSTACK_H_#define _SEQSTACK_H_#include #define MAXSIZE 10#define INCREASE 3typedef int ElementType;typedef struct SeqStack{ ElementType *Base; int top; int原创 2017-03-29 00:05:44 · 295 阅读 · 0 评论 -
链式队列
//main.cpp#include "LinkQueue.h"#include #include void main(){ LinkQueue lq; ElementType e; InitQueue(&lq); printf("入栈\n"); for(int i = 0; i <= 10; i++) EnQueue(&lq, i); printf("队列大小原创 2017-03-30 19:18:49 · 258 阅读 · 0 评论 -
树与二叉树相关概念
树树是n( n >= 0 )个节点的有限集合。在任意一颗非空树中(1) 有且仅有一个特定的称为根的节点(2) 当 n > 1 时,其余节点可分为m( m > 0 )个互不相交的有限集 T1、T2…Tm,其中每一个集合本身又是一棵树,并且称为根的子树。 术语根 根节点(没有前驱)叶子 又叫终端节点(没有后继, 度为0)原创 2017-04-09 01:49:55 · 454 阅读 · 0 评论 -
线索化二叉树
线索化之前线索化之后//LinkBinTreeThread.h#ifndef _LINKBINTREETHREAD_H_#define _LINKBINTREETHREAD_H_#include <stdio.h>#include <stdlib.h>#include <string.h>/* *存在n个节点的的二叉树拥有 n + 1 个空指针域,也就是叶子节点与度原创 2017-04-25 08:52:03 · 329 阅读 · 0 评论 -
基数排序
//RadixSort.h#ifndef _RADIXSORT_H_#define _RADIXSORT_H_#include #include #include #include "List\List.h"#define SIZE 15typedef int Element;typedef Element ListType[SIZE];void CreateRan原创 2017-06-08 20:28:35 · 260 阅读 · 0 评论 -
插入排序
//InsertSort.h#ifndef _INSERTSORT_H_#define _INSERTSORT_H_#include #include #include #define SIZE 15typedef int Element;typedef Element ListType[SIZE + 1]; //第0个元素用作哨兵或是辅助空间void CreateR原创 2017-06-04 15:02:50 · 254 阅读 · 0 评论 -
二叉查找树、平衡二叉树、红黑树、B-/B+树性能对比
作者:奔跑的小河连接:http://blog.csdn.net/z702143700/article/details/49079107前言:BST、AVL、RBT、B-tree都是动态结构,查找时间基本都在O(longN)数量级上。下面做出详细对比。1. 二叉查找树 (Binary Search Tree)BST 的操作代价分析:(1) 查找代价:转载 2017-05-25 00:05:21 · 594 阅读 · 0 评论 -
红黑二叉查找树的插入
无奈,书上所说的删除还没能领悟,以后补上吧//RBTree.h#ifndef _RBTREE_H_#define _RBTREE_H_#include typedef int Element;typedef enum{ RED, BLACK}Color;typedef struct _RBT_Node_{ Color NodeColor; Element da原创 2017-05-24 22:36:23 · 314 阅读 · 0 评论 -
AVL旋转图解
单旋转 (即最小不平衡子树与其子树的平衡因子同号) (此处仅拿需要右旋转的不平衡树来说)情况1:最小不平衡子树树根只有一个孩子节点 最小不平衡子树 旋转后(注:红色的X代表该节点为空原创 2017-05-05 08:17:10 · 641 阅读 · 0 评论 -
AVL Tree概念之旋转
在探寻AVL Tree旋转这一概念之前,需要弄清楚的一些概念: 1、二叉搜索树(BinarySearch Tree):若树的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树(Reference to二叉搜索树) 2、An AVL treeis a self-ba原创 2017-05-01 23:56:19 · 3654 阅读 · 0 评论 -
红黑二叉查找树
截取自算法(第四版)替换3-节点:红黑二叉查找树背后的基本思想是用标准二叉查找树(完全由2-节点构成)和一些额外的信息(替换3-节点)来表示2-3树。红黑树中的链接分为两种:1、 将两个2-节点连接起来构成3-节点的红链接2、 2-3树中的普通链接为黑链接将两个-2节点用左斜的红色链接链起来可表示3-节点 一种等价的定义: 一一对应1、 如果将一颗红黑树原创 2017-05-22 23:52:36 · 525 阅读 · 0 评论 -
二叉树的后序遍历--非递归实现
作者: 小雨淅淅 连接:http://www.cnblogs.com/rain-lei/p/3705680.htmlleetcode中有这么一道题,非递归来实现二叉树的后序遍历。二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态。显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root。转载 2017-04-16 11:08:41 · 389 阅读 · 0 评论 -
数据结构之字符串
梦醒潇湘lovehttp://blog.chinaunix.net/uid-26548237-id-3474783.html1、串的相关概念 1)串(string)是由零个或多个字符组成的有限序列,又名叫字符串。 2)串中含有的字符数据称为串的长度,零个字符的串称为空串(null string),它的长度为零。转载 2017-04-07 23:05:15 · 309 阅读 · 0 评论 -
(一)数据结构中的基本概念
一个经典的公式:程序设计= 数据结构+ 算法 数据结构的研究范围:1. 非数值计算类型的程序问题2. 数据间的组织和操作方式3. 数据的逻辑结构与存储结构 研究数据结构的意义:在于写出高质量的代码:用尽量少的时间、尽量少的步骤、尽量少的内存解决问题 一些概念:1. 数据:1) 描述客观事物的符号2)原创 2017-03-04 16:42:09 · 421 阅读 · 0 评论 -
AVL树删除
AVL Tree与BST由于AVL树本身就是一颗自平衡的BST,因此其的删除比起BST仅仅多了删除后平衡的调整 查找:AVL树中一定不存在两个值大小相同的节点从AVL树根开始向下搜索,根据意图删除值与当前节点值大小关系进行下一步操作:1、 当前节点值大于意图删除值,保存当前节点并在当前节点的左子树中继续查找意图删除值2、 当前节点值小于意图删除值,保存当前节点并在当原创 2017-05-16 00:39:22 · 3622 阅读 · 1 评论 -
跳表(skiplist)的代码实现
作者:刘浩de技术博客链接:http://www.cnblogs.com/liuhao/archive/2012/07/26/2610218.html跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN)。LevelDB的核心数据结构是用跳表实现的,redis的sorted set数据结构也是有跳表实现的。其结构如下所示:转载 2017-05-29 08:40:07 · 399 阅读 · 0 评论 -
AVL树的旋转操作详解
作者:樱の空连接:http://www.cnblogs.com/cherryljr/p/6669489.html【0】README0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205 0.1) 本文仅针对性地分析AVL树的单旋转(左左单旋转和右右单旋转)和 双转载 2017-04-27 22:51:45 · 477 阅读 · 0 评论 -
归并排序
//MergeSort.h#ifndef _MERGESORT_H_#define _MERGESORT_H_#include #include #include #include #define SIZE 15typedef int Element;typedef Element ListType[SIZE];void CreateRandom(ListType L原创 2017-06-07 21:23:02 · 285 阅读 · 0 评论 -
白话经典算法系列之三 希尔排序的实现
作者:MoreWindows链接:http://blog.csdn.net/morewindows/article/details/6668714希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进转载 2017-06-02 23:14:44 · 307 阅读 · 0 评论 -
插入排序:二路插入
作者:苏叔叔链接:http://blog.csdn.net/zhangxiangdavaid/article/details/27958143?utm_source=tuicool&utm_medium=referral在上一篇博客中:插入排序:直接插入、交换插入、折半插入。提到了三种插入排序的具体实现。不过仍有改进的地方。例如序列 2 1 3,当把1往前插入时,由于1转载 2017-06-02 08:39:18 · 363 阅读 · 0 评论 -
排序系列 之 折半插入排序算法 —— Java实现
作者:那一季的银杏叶链接:http://www.cnblogs.com/snowcan/p/6244361.html基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的转载 2017-06-01 23:53:39 · 475 阅读 · 0 评论 -
白话经典算法系列之二 直接插入排序的三种实现
作者:MoreWindows链接:http://blog.csdn.net/morewindows/article/details/6665714直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。1. 初始时,a[0]自成1转载 2017-06-01 21:45:34 · 240 阅读 · 0 评论