算法与数据结构
云中孤鹜
这个作者很懒,什么都没留下…
展开
-
根据前序遍历序列和中序遍历序列构造二叉树算法
一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树。 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root), 然后在中序序列(InSequence)中查找此根(root), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为根的左子树的中序遍历序列, 后边的序列为根的右子树的中序遍历原创 2013-07-08 11:37:40 · 44625 阅读 · 7 评论 -
希尔排序小结
当一个系列有序时,用直接插入排序的时间复杂度为O(N2)。当系列基本有序时,用直接插入排序的效率也较高.由于直接插入排序简单,且当系列的规模较小时效率比较高,希尔排序正是从这两点出发对直接插入排序进行改进得到的一种排序方法。 希尔排序的基本思想是:先将整个待排记录系列分割成若干个子系列分别进行直接插入排序,待整个系列中的记录"基本有序"时,再对全体记录进行一次直接插入排序. 注意:希尔排序原创 2013-07-24 16:00:24 · 746 阅读 · 0 评论 -
快速排序的递归和非递归实现
快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个 序列有序. 快速排序是一种不稳定的排序方法,其平均时间复杂度为:O(NlogN). 特别注意:快速排序中用到的Partition函数,它的作用是进行一趟快速排序,返回"曲轴“记录所在的位置p."曲轴“记录就是一个参考记录,经原创 2013-07-24 21:49:46 · 16156 阅读 · 1 评论 -
起泡排序和简单选择排序小结
起泡排序和简单选择排序都是一种很简单的排序方法,它们的时间复杂度都为O(N2). 其中起泡排序是一种稳定的排序方法,而简单选择排序是一种不稳定的排序方法. 这里直接贴代码 // 起泡排序和简单选择排序.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include using namespace std;//交换a与bvoid swap原创 2013-07-25 09:45:47 · 1558 阅读 · 0 评论 -
堆排序小结
堆排序定义 n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ ) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若原创 2013-07-25 13:02:53 · 664 阅读 · 0 评论 -
2-路归并排序详解
2-路归并排序的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列.1、算法基本思路 设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。(1)合并过程 合并过程中,设置i,j和p三个指针,其原创 2013-07-25 20:57:36 · 12644 阅读 · 1 评论 -
递归和非递归的方法往二叉排序树中插入新的节点
今天在回寝室的路上同学跟我讨论往二叉排序树中插入新的节点,我一想这不很简单吗,回到寝室立马写了个程序让他看,他一看说我要的是递归的方法。我一想递归的话,每次调用函数不都插入了一个新节点,那不建立成一颗二叉排序树了吗,不是插入一个节点。我又看了一下非递归的方法,发现当根为空时直接将新建的节点p赋给根节点t,这主要用到了引用赋值的原理,对,我可以利用引用的原理。(1)当根为空时,直接将根 t 赋值为新原创 2013-08-25 00:02:37 · 11209 阅读 · 3 评论 -
递归和非递归实现链表反转
链表反转是面试笔试常考题目,直接贴代码。反转函数如下://思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面void ReverseList(ListNode * & head){ //如果链表为空或者链表中只有一个元素 if(head==NULL || head->m_pNext==NULL) return; ListNode原创 2013-08-26 16:43:56 · 17357 阅读 · 3 评论 -
从海量数据中找出最小的k个数
从大量(海量)数据中查找最小的k(k一般比较小)个数,这是笔试中常考的题目。 如果是从少量数据中查找最小的k个数据,并且允许修改允许修改原始数据,侧利用Partition()函数,在O(N)的时间复杂度,O(1)的空间复杂度就可以找到最小的k个数据。 从大量数据中查找最小的k个数,我们可以利用一个容器先存储前k个数据,然后从数据中读取下一个数,判断该数是与容器中最大的数的大小,如果该数较原创 2013-08-30 17:52:25 · 4330 阅读 · 0 评论 -
求两个链表是否相交总结
求两个链表是否相交总结 求两个单链表是否相交分三种情况讨论:1,如果两个链表一个有环,一个无环则一定不相交2.如果都没有环,则判断两个链表的最后节点是否相同,如果相同则相交,不相同则不相交。3.如果都有环,则判断一个链表环里的节点是否是另一个链表环里的节点。如果是则相交,如果不是则不相交。 现在的问题是如何判断一个链表是否有环?我们可以设两个指针p1,p2。p1一次移动原创 2013-09-10 15:46:41 · 1572 阅读 · 0 评论 -
插入排序代码小结
插入排序就是将要排序的记录插入到已经排序号了的记录系列中去的过程. 常见的插入排序算法有 直接插入排序,折半插入排序,二路插入排序,表插入排序等. 直接插入排序,折半插入排序,,表插入排序 测试通过代码如下: // 插入排序.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include using namespace std;void原创 2013-07-24 14:46:57 · 876 阅读 · 0 评论 -
并查集实现等价类
等价关系:集合或类(以集合为例)上的等价关系R指一个具有自反, 对称, 传递性的二元关系。等价类: 在一个定义了等价关系的集合中可以按该等价关系分成等价类(即两个元素只要有xRy, 则它们属于同一等价类), 即集合的一些子集组成的集,。容易证明这些等价类两两不交且其并等于原集合. 假设集合S有n个元素,m个形如(x,y) (x,y 属于 S)的等价偶对确定了等价关系R,如何求S的划分,即该原创 2013-07-04 15:15:58 · 8575 阅读 · 0 评论 -
判断一个图(无向图和有向图)是否有环
没有找到原文出处,请参考一下链接:http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.htmlhttp://topic.csdn.net/u/20071023/11/3edb81fc-37b2-4506-906e-44dc0fc521f2.html一、无向图:方法1:如果存在回路,则必存在一个子图转载 2013-07-09 15:45:51 · 4659 阅读 · 0 评论 -
位运算实现加减乘除
#include #include //加法运算int add(int a, int b){ return b==0 ? a: add(a^b,(a&b)<<1);}//补码中正数转负数的原理int negative(int a){ return add(1,~a);}//减法运算int sub(int a,int b){ return add(a,negati转载 2013-06-26 13:35:38 · 629 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说转载 2013-06-27 13:03:13 · 754 阅读 · 0 评论 -
斐波那契查找详解
斐波那契查找的前提是待查找的查找表必须顺序存储并且有序。 相对于折半查找,一般将待比较的key值与第mid=(low+high)/2位置的元素比较,比较结果分三种情况 1)相等,mid位置的元素即为所求 2)> ,low=mid+1; 3) 斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记原创 2013-07-16 14:38:42 · 24983 阅读 · 5 评论 -
二叉排序树
二叉排序树又名二叉查找树,其定义如下: 二叉树的定义如下://定义二叉查找树的节点templatestruct TreeNode{ T key; TreeNode * lchild; TreeNode * rchild;}; 二叉排序树的查找算法如下://在二叉树head中查找关键字为key的元素,//若存在返回true,p指向该节点/原创 2013-07-17 14:43:59 · 847 阅读 · 0 评论 -
KMP算法
1.简单匹配算法 思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到在S中找到与T匹配的或S比较完。时间复杂度为O(M*N)(M=len(S),N=len(T))算法如下://简单匹配算法int Index(char * S,char * T){原创 2013-06-28 14:46:11 · 622 阅读 · 0 评论 -
完全二叉树叶子节点的个数
题目:一个具有n个节点的完全二叉树,其叶子节点的个数为多少?分析: 设叶子节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2 侧有 n0+n1+n2=n (1) 对于二叉树有: n0=n2+1原创 2013-07-02 13:32:38 · 48546 阅读 · 0 评论 -
二叉树各种操作的非递归实现
#include "stdafx.h"#include #include #include //定义二叉树(二叉链表表示法)的节点typedef struct BiTNode{ char data;//数据域 struct BiTNode * lchild;//指向左子树 struct BiTNode * rchild;//指向右子树} BiTNode, * BiTree;原创 2013-07-02 16:56:53 · 3131 阅读 · 0 评论 -
求集合的组合和排列问题
排列组合为数学中常见问题,但是正要用算法表示出来相信还是有一定困难的.这里将用递归算法实现排列和组合问题 1)组合问题 算法实现如下://求组合//i表示当前处理是那个元素,src表示要求组合的原集合,n表示原集合中元素的个数//a用于存储元集合的一个组合,m表示a重元素的个数void Combination(int i,int * src,int n,int * a原创 2013-07-05 13:13:18 · 1213 阅读 · 0 评论 -
求二叉树中两个节点的最低公共祖先节点
直接贴代码 #include "stdafx.h"#include #include using namespace std;//定义二叉树的节点struct BinaryTreeNode{ char m_nvalue; BinaryTreeNode * m_pleft; BinaryTreeNode * m_pright;};//创建值为value的节点B原创 2013-09-05 12:11:51 · 3010 阅读 · 0 评论