10 2014 档案

摘要:一般来说,我们可以用异或运算来交换两个整数,这样可以避免在交换的过程中用到临时变量。(其实用到一个临时变量也不影响程序性能,所以此处无非是编程技巧的考察了。)代码可以这样写:1 void2 Swap(int *a, int *b)3 {4 5 *a ^= *b;6 *b ^=... 阅读全文
posted @ 2014-10-31 15:20 nipan 阅读(2471) 评论(0) 推荐(0) 编辑
摘要:如果要我们找出一个数组中的最小(最大)的元素,那么第一反应肯定是使用最小(最大)堆。时间复杂度等同于建堆的复杂度,这里是O(N)。如果要我们找出一个数组中的第k个最小的元素,那么我们依然可以使用最小堆,删除掉k次的最小值,就得到了结果。复杂度是O(N + klogN)。如果要我们找出一个数组的中值,... 阅读全文
posted @ 2014-10-31 14:35 nipan 阅读(285) 评论(0) 推荐(0) 编辑
摘要:快速排序是递归的思路谈起来是很简单的:(1)当待排元素S个数为1的时候,什么也不做。(2)在待排元素S中取一个元素作为枢纽pivot。(3)将待排元素分成三份:小于pivot的元素S1、pivot它自己、大于pivot的元素S2。(4)对小于pivot的元素S1进行快速排序,对大于pivot的元素S... 阅读全文
posted @ 2014-10-30 16:23 nipan 阅读(261) 评论(0) 推荐(0) 编辑
摘要:堆排序,就是利用二叉堆的特性来完成排序的工作。这里假定我们要完成对一个数组进行从小到大排序的工作,那么利用最小堆(见《二叉堆 - 最小堆》)的特性,对于一个已经建好的最小堆,我们每次以DeleteMin函数取出最小的元素,放入一个临时数组中,如此一来,就完成了对该数组的排序。时间复杂度的话,建立堆的... 阅读全文
posted @ 2014-10-29 16:17 nipan 阅读(312) 评论(0) 推荐(0) 编辑
摘要:与上篇《二叉堆 - 最小堆》类似,只不过堆序(heap order)从内部节点小于左右子节点变成了内部节点大于左右子节点。代码如下: 1 #include 2 #include 3 4 #define MIN (1items =(Item*)malloc((maxItems+1)*si... 阅读全文
posted @ 2014-10-29 15:31 nipan 阅读(288) 评论(0) 推荐(0) 编辑
摘要:二叉堆:一般我们拿来用的就是最大堆和最小堆。最小堆:每个节点的值比它的左右子节点的值要大。代码实现如下:参考Mark Allen Weiss《数据结构和算法分析》(第二版) 1 #include 2 #include 3 4 #define MIN (1items =(Item*)ma... 阅读全文
posted @ 2014-10-28 22:49 nipan 阅读(923) 评论(0) 推荐(0) 编辑
摘要:我体会的希尔排序,是插入排序的的一种改进,对待排序的数组以一定的间隔划分成子数组,将这些子数组进行插入排序。随后间隔减小,划分新的子数组,插入排序。直至间隔为1,对完整的数组进行插入排序。贴出希尔排序的实现和插入排序的实现,可以进行对比。 1 // Shell sort, can be treate... 阅读全文
posted @ 2014-10-28 10:12 nipan 阅读(210) 评论(0) 推荐(0) 编辑
摘要:先说一下,这个归并排序(版本一)是我自己的一些想法。简单地浏览了一下书本(《算法:C语言实现》(第三版)),实现方法并不一致。但是这个算法我测试了一下,还行。归并排序:分治法的思路。把一个待排序的数组(arr)分成两半(arrA和arrB)进行归并排序。在归并排序的过程中,arrA再分成两半……这个... 阅读全文
posted @ 2014-10-26 21:43 nipan 阅读(219) 评论(0) 推荐(0) 编辑
摘要:简单实现了一下插入排序的算法,针对数组进行排序。插入排序:针对一个需要排序的数组,我们把它的第一个元素当成已经排好的序列。然后我们从第二个元素开始,一个元素接着一个元素地(见第一个循环,i从1到len-1)往这个已经排好的序列当中插入“新”的元素,每次插入的时候要保证这个新的元素在这个序列中是有序的... 阅读全文
posted @ 2014-10-26 21:32 nipan 阅读(176) 评论(0) 推荐(0) 编辑
摘要:简单地用递归的方法实现了二分查找算法,适用于数组。二分查找算法的前提条件是数组本身是有序的,比如int arr[6] = {2, 3, 5, 7, 11, 13};在数据是稳定有序、几乎不存在插入和删除操作的情况下,二分查找是实用的。代码如下: 1 // 递归 2 int 3 BinarySear... 阅读全文
posted @ 2014-10-26 21:17 nipan 阅读(193) 评论(0) 推荐(0) 编辑
摘要:1. 检查一个整数x是否是2的倍数:x & (x-1)提示:如果x是2的倍数,那么x的二进制数中只有一位是1。2. 最大的有符号整数(32位)~(1 b,如果为1,则a>(sizeof(int)*8-1)假设上式的值为s,另外假设右移操作为逻辑右移。则s的值为0或者1。所以我们可以得到a和b中较大的... 阅读全文
posted @ 2014-10-25 22:34 nipan 阅读(1780) 评论(0) 推荐(0) 编辑
摘要:读了Robert Sedgewick的《算法:C语言实现》(第三版)的第五章,了解了许多关于树,特别是二叉树的知识。这里总结一下。直接看代码(C++)吧。 1 #include 2 #include 3 #include 4 #include 5 6 #define null ... 阅读全文
posted @ 2014-10-25 22:30 nipan 阅读(160) 评论(0) 推荐(0) 编辑
摘要:问题:现在有两个字符串,我们要寻找它们最长的公共子串。比如regression和express这两个字符串,它们的子串有e和ress,那么它们的最长公共字串就是ress。解法:我们利用一个二维数组来记录两个字符串相互匹配的情况,如果字符串str1长度为len1,字符串str2长度为len2,那么数组... 阅读全文
posted @ 2014-10-24 20:05 nipan 阅读(515) 评论(0) 推荐(0) 编辑
摘要:今年五月份的时候,宿舍的人找实习,笔试碰到一道货币组合的问题,是这样子的:现在我们有1元、2元、5元、10元、20元和50元,每种面值都有若干张。请问,如果要用这些货币组成100元的话,有多少种方法?他们笔试回来,就讲了这个问题。当时本菜就写了个暴力的方法(反正计算机有这么大的算力……) 1 #in... 阅读全文
posted @ 2014-10-23 20:57 nipan 阅读(583) 评论(0) 推荐(0) 编辑
摘要:问题一:有12个外形一致的金属球,其中11个重量相同,另外有1个较轻。现在有一架天平,请用天平在3次以内找出那颗较轻的金属球。问题二:有12个外形一致的金属球,其中11个重量相同,另外有1个重量与其他的球不同,也许是轻,也许是重。现在有一架天平,请用天平在3次以内找出那颗重量与众不同的金属球。问题一... 阅读全文
posted @ 2014-10-23 17:00 nipan 阅读(3364) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示