摘要: 堆排序的思想是利用数据结构--堆。具体的实现细节: 1. 构建一个最大堆。对于给定的包含有n个元素的数组A[n],构建一个最大堆(最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元素存放在根节点中;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值)。从最底下的子树开始,调整这个堆结构,使其满足最大堆的特性。当为了满足最大堆特性时,堆结构发生变化,此时递归调整对应的子树。 2. 堆排序算法,每次取出该最大堆的根节点(因为根节点是最大的),同时,取最末尾的叶子节点来作为根节点,从此根节点开始调整堆,使其满足最大堆的特性。 3. 重复上一步操作,直到堆的.. 阅读全文
posted @ 2013-10-02 19:00 Crazy Eric 阅读(638) 评论(1) 推荐(0) 编辑
摘要: 问题:有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6 盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推,直到第100轮。问第100结束后,还有多少盏灯泡是亮的?解答:由题意最如果最后某一盏灯是亮着的,那么它一定是被切换了奇数次(第0次的时候全部都关着)。首先来看一下6这盏灯,它被切换的次数是第1次(轮),第2次,第3次和第6次。可以看出如果某一轮6被切换了,那么该轮数一定可以整数6,即是6的约数,由于约数是成对出现的,所以6被关掉的次数是偶数次。但是是对于像4,16这样的完全平方数, 阅读全文
posted @ 2013-10-02 13:06 Crazy Eric 阅读(649) 评论(0) 推荐(0) 编辑
摘要: http://blog.csdn.net/realxie/article/details/8078043假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数。解法一:使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略过。解法二:使用二分的方法。算法思想在代码注释中#include#include#includeusingnamespacestd;//Notice:K>0intFindKthElm(intA[],intaBeg,intaEnd,intB[],intbBeg,intbEnd,intk){if(aB 阅读全文
posted @ 2013-10-02 12:55 Crazy Eric 阅读(461) 评论(0) 推荐(0) 编辑
摘要: 本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求:1. O(1)空间复杂度,即只能使用常数空间;2. 二叉树的形状不能被破坏(中间过程允许改变其形状)。通常,实现二叉树的前序(preorder)、中序(inorder)、后序(postorder)遍历有两个常用的方法:一是递归(recursive),二是使用栈实现的迭代版本(stack+iterative)。这两种方法都是O(n)的空间复杂度(递归本身占用stack空间或者用户自定义的stack),所以不满足要求。(用这两种方法实现的中序遍历实现可以参考这里。)Morris Traversal方法可以做到这两点,与前两种方法... 阅读全文
posted @ 2013-10-02 12:54 Crazy Eric 阅读(350) 评论(0) 推荐(0) 编辑