数据结构与算法
文章平均质量分 62
王世晖
呵呵哒
展开
-
用堆排序寻找数组中最大的K个数
/***********************************************************************************堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。通常堆是通过一维数组来实现的。在起始数组为 0原创 2013-04-22 15:31:06 · 4148 阅读 · 0 评论 -
面试高频题:单链表的逆置操作/链表逆序
函数内修改的是实参的副本。要想在函数内部修改输入参数,要么传入的是实参的引用,要么传入的是实参的地址。原创 2013-07-29 16:22:16 · 1992 阅读 · 0 评论 -
[二叉树专题]:递归求解二叉树的叶子节点数目
递归求解二叉树的叶子节点数目template int BinaryTree::leavesCount(nodeType *p) { if(p == NULL) { return 0; } else if(p->llink == NULL && p->rlink ==NULL) { return 1原创 2013-07-30 19:01:52 · 1430 阅读 · 0 评论 -
[二叉树专题]:先序遍历二叉树的递归实现与非递归实现
1、先序遍历二叉树 递归实现思想:若二叉树为空,返回。否则 1)遍历根节点;2)先序遍历左子树;3)先序遍历右子树;代码: template void PreOrder(nodeType *root) { if(root==NULL) return ; visit(root->data); // vis原创 2013-07-30 19:20:39 · 2006 阅读 · 0 评论 -
[二叉树专题]:递归求解二叉树的高度
递归求解二叉树的高度等于左右子树的最大高度+1 templateint BinaryTree::height(nodeType *p){ if( p == NULL) { return 0; } else { return 1 + max( height(p->llink),height原创 2013-07-30 18:55:52 · 1943 阅读 · 0 评论 -
[二叉树专题]:递归求解二叉树的全部节点数目
递归求解二叉树的全部节点数目template int BinaryTree::nodeCount(nodeType*p) { if(p == NULL) { return 0; } else { return 1 + nodeCount(p->llink) +nodeCount(p->rl原创 2013-07-30 18:58:55 · 1374 阅读 · 0 评论 -
C语言实现双向链表删除节点、插入节点、双向输出等操作
#include#includetypedef struct DoubleLinkedList{ int data; struct DoubleLinkedList *pre; struct DoubleLinkedList *next;}DlinkedList_Node;//建立链表DlinkedList_Node* createDLink(){ D原创 2013-07-31 15:26:49 · 7257 阅读 · 1 评论 -
【算法题】:跳台阶问题及斐波那契Fibonacci序列
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。 现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时原创 2013-07-31 20:49:27 · 2596 阅读 · 1 评论 -
包含min函数的栈
描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的函数。在该栈中,调用min,push,pop的时间复杂度都是O(1) template class min_stack{ public: min_stack(){}; ~min_stack(){}; T my_min(); void my_原创 2013-08-02 16:14:12 · 1118 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现队列。队列声明如下,请实现它的两个函数append_tail和delete_head在队列的队尾添加数据和删除队头 class Queue_by_stack{ public: Queue_by_stack(){}; ~Queue_by_stack(){}; void append_tail(const T& n原创 2013-08-02 16:01:38 · 1132 阅读 · 0 评论 -
用两个队列实现栈
使用两个队列实现一个栈 这个栈的声明如下:templateclass Stack_by_queue{ public: Stack_by_queue(){}; ~Stack_by_queue(){}; void append_tail(const T& node); T delete_head();原创 2013-08-02 16:07:17 · 1357 阅读 · 0 评论 -
在O(1)时间内删除链表指定结点
链表节点结构如下,struct ListNode { int m_nKey; ListNode* m_pNext; }; 求出在O(1)时间内删除链表给定结点的算法函数,该函数的声明如下:void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted);struct ListNo原创 2013-08-03 22:14:43 · 1476 阅读 · 0 评论 -
【面试】:数组和链表的区别
数组:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。链表:链表恰好相反,链表中的元素在内存中原创 2013-08-06 10:42:12 · 12807 阅读 · 4 评论 -
【链表专题】:合并两个有序链表
合并两个有序链表/*****************************************************************************/typedef struct Node{ int data; struct Node* next;}Node, *LinkList;void Merge(const LinkList l原创 2013-08-11 16:45:21 · 1495 阅读 · 0 评论 -
[二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树
层次遍历二叉树1、若树非空,访问根结点。2、若第1,…i(i≥1)层结点已被访问,且第i+1层结点尚未访问,则从左到右依次访问第i+1层。层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点。为保证是按层次遍历,必须设置一个队列,初始化时为空。设T是指向根结点的指针变量,层次遍历非递归算法是:若二叉树为空,则返回;否则,令p=T,p入队;原创 2013-08-10 21:51:50 · 2287 阅读 · 0 评论 -
C++实现单链表的创建、插入、删除、逆置操作
#includeusing namespace std;typedef struct List_Node{ int data; struct List_Node *next;} node, *node_pointer;node *creat( int num ){ node_pointer p; p = new node; p -> data = num; p ->原创 2013-08-14 10:41:52 · 1738 阅读 · 0 评论 -
【动态规划】求最大连续bit数
功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字 输出: 无 返回: 对应的二进制数字中1的最大连续数输入描述:输入一个byte数字输出描述:输出转成二进制之后连续1的个数输入例子:3输出例子:原创 2016-03-29 21:03:40 · 1273 阅读 · 0 评论 -
数据结构与算法之动态数组实现堆栈
#include #include using namespace std;typedef int T;typedef struct tag{ int Top, MaxSize; T *elememtsp;}STACK;void creat(STACK *stack, int size){ stack -> Top = -1;原创 2013-06-05 21:44:40 · 1051 阅读 · 0 评论 -
C/C++经典面试题之判断链表是否有环
#include typedef struct list{ int data; struct list *next;}LIST;/* Method 1: check the occurrence of p->next from head to p */bool check_circle_1(LIST *head){ LIST *p = head, *q= N原创 2013-06-05 21:28:35 · 2093 阅读 · 0 评论 -
华为笔试题:将所给数据分解成质因数相乘形式 如435234=251*17*17*3*2
/***分解成质因数(如435234=251*17*17*3*2,华为笔试题)***/#include#includevoid prim(int m, int n){ if(m>n) { while(m%n != 0) n++; m /= n; prim(m, n); printf("%d*", n);原创 2013-04-25 21:45:53 · 2107 阅读 · 0 评论 -
采用bitmap位图算法对大量不重复数据进行线性时间排序
/********************************************************************************* 问题描述输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。输出:按升序排列的输入正数的列表。约束:最多有1MB的内存空间可用,有原创 2013-04-27 17:44:38 · 2185 阅读 · 0 评论 -
IBM面试题:海盗分金算法及其思想
IBM面试题:妈妈有2000元,要分给她的2个孩子。由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分。但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下 1000元的分钱方式,这时如果哥哥同意了,就分掉这剩下的1000元。但如果哥哥也不同意,妈妈会把剩下的1000元也拿走,然后分别只给他们每人100元。问:如果你是哥哥,你会提出什么样的分钱方式,使你有可能得到最多的钱?(最小转载 2013-04-27 17:50:28 · 4966 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
/***************************************************************************不要求相对顺序输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n),不要求奇数的相对顺序和偶数的相对顺序。思路:维护两个指针,第一个指针(设为firstEven)初原创 2013-04-18 18:05:01 · 1063 阅读 · 0 评论 -
直接选择排序的C++实现及随机数组的产生方法
#include#include#include#include#includeusing namespace std;void selectSort(int a[],int count){ int i,j,min,temp; for(i=0;i<count-1;i++) //进行count-1 次选择 { min=i; //假原创 2013-04-20 15:39:51 · 3387 阅读 · 0 评论 -
冒泡排序的C++实现及随机数组的产生方法
#include#include#include#include#includeusing namespace std;// 生成元素为随机数的数组void Random(int a[],int n){ int i=0; srand( (unsigned)time( NULL ) ); while(i<n) { a[i++]=rand原创 2013-04-20 15:48:12 · 1683 阅读 · 0 评论 -
快速排序算法的C++实现及随机数组的产生方法
#include#include#include#includeusing namespace std;// 生成元素为随机数的数组void Random(int a[],int n){ int i=0; srand( (unsigned)time( NULL ) ); while(i<n) { a[i++]=rand(); }原创 2013-04-20 16:05:59 · 3586 阅读 · 0 评论 -
面试最基本的三种排序算法 冒泡排序 插入排序 选择排序
#include #include#include#includeusing namespace std;/********创建数组,并输入元素************/void Random(int a[],int n){ int i=0; srand( (unsigned)time( NULL ) ); while(i<n) { a原创 2013-04-20 16:09:52 · 1371 阅读 · 0 评论 -
面试:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
/***********************************************************************有个数字出现的次数超过了数组长度的一半,也就是,有个数字出现的次数比其他所有数字出现次数的和还要多。遍历数组时保存连个值,一个是数组中的数字,一个是出现的次数,遍历到一个数字时,如果该数字和之前保存的数字相同,则次数加一,如果该数字和之前保存的数原创 2013-04-19 11:35:42 · 1687 阅读 · 0 评论 -
堆排序 完整代码与详细注释 C++语言实现
/***********************************************************************************堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。通常堆是通过一维数组来实现的。在起始数组为 0原创 2013-04-20 17:13:41 · 2044 阅读 · 0 评论 -
二路归并排序算法实现-完整C语言程序
/***********************************************************************************************1.设定两个指针,最初位置分别为两个已经排序序列的起始位置2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置3.重复步骤3直到某一指针达到序列尾4.将另一序列剩下的所有原创 2013-04-20 18:38:51 · 5205 阅读 · 0 评论 -
找出两个字符串的最大公共子串
#include#include#include#includeusing namespace std;/*不太合理的地方时返回堆内存 防止内存泄露的任务交给了函数调用者*/char* GetSameSubstr(const char* s1,const char* s2){ int len1=strlen(s1); int len2=strlen(s2);原创 2013-04-21 09:55:08 · 1670 阅读 · 0 评论 -
google面试题目:寻找丑数--使用double防止数据溢出
/*******************************************************************************google面试题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第2012个丑数。分析:假原创 2013-04-22 11:19:01 · 9585 阅读 · 25 评论 -
直接插入排序的C++实现及随机数组的产生方法
#include#include#include#include#includeusing namespace std;// 生成元素为随机数的数组void Random(int a[],int n){ int i=0; srand( (unsigned)time( NULL ) ); while(i<n) { a[i++]=rand原创 2013-04-20 15:30:45 · 2357 阅读 · 0 评论 -
希尔排序(shell排序)的详细解说,对插入排序算法的改进
希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。插入排序的效率在某些时候是很高的,比如,记录本身就是基本有序的,只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。可问题在于,两个条件本身就过于苛刻,现实中记录少或原创 2013-05-02 22:27:29 · 2107 阅读 · 0 评论 -
求链表的倒数第K个节点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针保持不动;在第k-1步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。程序如下原创 2013-06-02 23:35:41 · 1668 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面,偶数和偶数之间的相对位置不变
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:先扫描一遍数组,做三件事,1、奇数往前挪,2、统计偶数个数,3、保存偶数到队列。扫描结束后,奇数都被挪到了前边,紧凑的挨在一块,后边留出了一些空余的位置,位置的个数就是偶数的个数。将保存在队列里边的偶数按照进队列原创 2016-04-25 15:59:50 · 3028 阅读 · 0 评论