排序算法小结
摘要:转自:http://blog.csdn.net/caryaliu/article/details/8280647从以下几个方面来比较排序算法:1. 算法的时间和空间复杂度2. 排序的稳定性3. 算法结构的复杂度4. 参加排序的数据规模排序的稳定性:稳定排序方法: 插入排序、冒泡排序、二路归并排序、基数排序是稳定排序算法;不稳定排序方法: 选择排序、谢尔排序、快速排序、堆积排序是不稳定排序算法。算法复杂度比较:各种内排序算法的时间、空间复杂度排序方法平均时间最坏情况辅助空间插入排序O(n*n)O(n*n)O(1)谢尔排序O(n*log2n)O(n*log2n)O(1)泡排序O(n*n)O(n*n
阅读全文
posted @
2014-04-06 17:11
猿人谷
阅读(2385)
推荐(0) 编辑
二元树中和为某一值的所有路径
摘要:题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12和10, 5, 7。二元树结点的数据结构定义为:struct BinaryTreeNode // a node in the binary tree{ int m_nValue; // value of node BinaryTreeNode *m_pLeft; // left child of node ...
阅读全文
posted @
2013-10-31 20:18
猿人谷
阅读(396)
推荐(0) 编辑
二叉树的遍历——递归和非递归
摘要:二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现[cpp] view plaincopyvoidpre_order(BTree*root){if(root!=NULL)//必不可少的条件..
阅读全文
posted @
2013-10-31 15:45
猿人谷
阅读(10430)
推荐(4) 编辑
队列的实现
摘要:一、顺序队列[cpp] view plaincopytypedefintQElemType;//c3-3.h队列的顺序存储结构(可用于循环队列和非循环队列)#defineMAXQSIZE5//最大队列长度(对于循环队列,最大队列长度要减1)structSqQueue{QElemType*base;//初始化的动态分配存储空间intfront;//头指针,若队列不空,指向队列头元素intrear;//尾指针,若队列不空,指向队列尾元素的下一个位置};//bo3-4.cpp顺序队列(非循环,存储结构由c3-3.h定义)的基本操作(9个)StatusInitQueue(SqQueue&Q){
阅读全文
posted @
2013-10-25 21:13
猿人谷
阅读(2886)
推荐(1) 编辑
顺序栈的实现和两栈共享空间
摘要:顺序栈的实现和两栈共享空间 以后慢慢启用个人博客:http://www.yuanrengu.com/ 一.顺序栈的实现 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先
阅读全文
posted @
2013-10-14 14:41
猿人谷
阅读(8580)
推荐(5) 编辑
双向链表
摘要:双向链表 在线性链式存储结构的结点中只有一个指示直接后继的指针域,由此,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前趋,则需从表头指针出 发。换句话说,在单链表中,NextElem的执行时间是o(1),而PriorElem的执行时间为O(n)。为克服单链表这种单向性的缺点,可利用双 向链表。 双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱。//线性表的双向链表存储结构typedef struct DulNode{ ElemType data; struct DulNod...
阅读全文
posted @
2013-10-14 09:48
猿人谷
阅读(573)
推荐(0) 编辑
删掉重复的数据
摘要:一)过滤重复的数据。即把原来重复的数据过滤,只保留一份。例如:inta[]={1,3,4,3,2,5,2};输出:13 4 25①实现方法一(采用STL):[cpp] view plaincopy#include#include#includeusingnamespacestd;voidDedup(FILE*infile,FILE*outfile){intiTemp;unsignedintnCount=0;typedefsetIntSet;IntSetiArray;while(NULL==feof(infile)){fscanf(infile,"%d",&iTemp
阅读全文
posted @
2013-10-13 17:14
猿人谷
阅读(701)
推荐(0) 编辑
二叉树的非递归遍历(递归和非递归)
摘要:二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现[cpp] view plaincopyvoidpre_order(BTree*root){if(root!=NULL)//必不可少的条件,递
阅读全文
posted @
2013-10-13 16:59
猿人谷
阅读(1801)
推荐(0) 编辑
根据前序和中序推出后序
摘要:最近面试总遇到这种根据给出的两类序遍历,然后求按另一种形式序的遍历。看来有必要好好总结下这个知识点,省的每次笔试时都得花不少时间推导。首先,我们看看前序、中序、后序遍历的特性:前序遍历:(根—>左—>右) 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树中序遍历:(左—>根—>右) 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树后序遍历:(左—>右—>根) 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点三序中知道其中两个就可以推出第三个,但前提是我们必须知道中序(这里是针对二叉树的,不包括二叉搜索树).因为:先序和后序给我们提供的信息是
阅读全文
posted @
2013-10-13 10:36
猿人谷
阅读(1003)
推荐(0) 编辑
树的子结构
摘要:面试题目:输入两颗二叉树A,B,判断B是不是A的子结构;#include #include using namespace std;typedef struct BinaryTreeNode{ int value; BinaryTreeNode * lchild; BinaryTreeNode *rchild;}BinaryTreeNode;typedef BinaryTreeNode * BiTree;void CreateBiTreeByLevel(BiTree &t,int Array[],int i,int len){ if(Array[i]==0||i > len) r
阅读全文
posted @
2013-10-10 16:28
猿人谷
阅读(359)
推荐(0) 编辑
出栈顺序
摘要:之前参加过华北计算机研究所和优酷土豆的笔试,都考到出栈顺序,之前数据结构学的不到位,遇到这类题时,还着实把我愣了一会,现在总结下,省得以后再遇到这类问题,也希望能给遇到同样问题的兄弟们一个参考。 废话不多说,直接上个例题。一个栈的入栈序列是a,b,c,d,e则栈的不可能的输出序列是:()A edcbd B decba C dceab D abcde 栈之根本——后进先出(Last In First Out , LIFO)初次接触到这个问题的人,或许会认为入栈abcde,所以出栈只能是edcba所以BCD都不对。 其实是这个问题描述有...
阅读全文
posted @
2013-10-09 20:17
猿人谷
阅读(22637)
推荐(4) 编辑
四则运算表达式
摘要:四则运算表达式 一种不需要括号的后缀表达法,我们把它称为逆波兰(Reverse Polish Notation , RPN)表示。它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式,解决了四则运算中括号改变运算符优先级的问题。 我们先来看看,对于"9+(3-1)×3+10÷2",如果要用后缀表示法应该是什么样子:“9 3 1 - 3 * + 10 2 / +” ,这样的表达式称为后缀表达式,叫后缀的原因在于所有的符号都是在要运算数字的后面出现。一.后缀表达式计算结果 为了解释后缀表达式的好处,我们先来看看,计算机如何应用后缀表达式计算出最终的结果
阅读全文
posted @
2013-10-09 16:59
猿人谷
阅读(3199)
推荐(4) 编辑
常见排序算法分析
摘要:一.常见排序算法的实现1.冒泡排序冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。按照定义很容易写出代码:void bubbleSort(int arr[],int n){ int i,j,t; for(i=0;i void bubbleSort(int arr[],int n){ int i,j,t; for(i=0...
阅读全文
posted @
2013-10-08 13:46
猿人谷
阅读(974)
推荐(0) 编辑
排序算法的稳定性和时间复杂度分析
摘要:这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个...
阅读全文
posted @
2013-10-08 13:28
猿人谷
阅读(2202)
推荐(0) 编辑
直接插入排序
摘要:直接插入排序直接插入排序(straight insertion sort)的作法是: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 直接插入排序属于稳定的排序,最坏的时间复杂度为O(n^2),空间复杂度为O(1)。 直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接 插入排序是将待比较的数值与它的前一个数值进行比较
阅读全文
posted @
2013-10-08 10:21
猿人谷
阅读(771)
推荐(0) 编辑
二分查找法的实现和应用汇总
摘要:来源:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。时间复杂度按优劣排差不多集中在:O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就数二分查找法,其他的诸如排序算法都是 O(n log n)或者O(n2)。但是也正
阅读全文
posted @
2013-09-10 22:03
猿人谷
阅读(1182)
推荐(0) 编辑
数据结构常见笔试题
摘要:反转一个无符号整数的比特位.Reverse the bits of an unsigned integer.For example, x is 0x00001234, then reverse(x) is 0x2C480000.static uint Reverse(uint x){ uint y = 0; for (int i = 0; i >= 1; } return y;}删除数组中的重复元素void remove_duplicate(int *a, int len){ int i = 0; int j = 0; for (j = 0; j 0 && key >
阅读全文
posted @
2013-09-09 16:27
猿人谷
阅读(1557)
推荐(0) 编辑
单链表
摘要:线性表的链式表示和实现 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以使不连续的)。因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像,称为结点。 结点包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称做指针或链。n个结点(ai(1next是指向第i+1个数据元素(结点ai+1)的指针。换句话说,若p->data=ai
阅读全文
posted @
2013-09-03 08:39
猿人谷
阅读(1750)
推荐(2) 编辑
顺序线性表
摘要:线性表的顺序表示和实现线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置或基地址。只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。数组类型有随机存取的特性,因此通常都用数组来描述数据接哦故中的顺序存储结构。由于线性表的长度可变,且所需最大存储空间随问题不同而不同,在C语言中可用动态分配的一维数组,如下描述。/* 线性表的动态分配顺序存储结构 */#define LIST_INIT_SIZE 100 /* 线性存储空间的初始分配量 */#de..
阅读全文
posted @
2013-09-02 16:15
猿人谷
阅读(2995)
推荐(0) 编辑
经典博客---《数据结构与算法》
摘要:1.http://www.cnblogs.com/JCSU/category/377626.html2.非常不错的博客。http://www.nowamagic.net/librarys/veda/detail/2241
阅读全文
posted @
2013-08-30 20:31
猿人谷
阅读(249)
推荐(0) 编辑