摘要: 《算法导论》学习记录目录快速排序,对于n个数的输入数组,最坏情况运行时间:Θ(n^2);期望运行时间:Θ(nlgn);就地排序(Sort in place)。数组A[p..r]会被分为两个子数组A[p..q-1]和A[q+1..r],其中A[p..q-1]的元素都不大于A[q],A[q+1..r]都... 阅读全文
posted @ 2013-09-28 18:21 alan_forever 阅读(4307) 评论(14) 推荐(2) 编辑
摘要: 算导本章的优先级队列是堆数据结构的一个应用,优先级队列分为两种:最大优先级队列和最小优先级队列。主要内容是基于最大堆实现最大优先级队列。关于堆数据结构的内容见此:堆。下文有关堆的代码解释也在链接的文章。“优先级队列是一种用来维护由一种元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key。“------《算法导论》我的代码实现与算导中关于最大优先级队列的支持操作有出入,我将increase-key操作删除,把insert操作修改了一下。具体支持的操作为下:1 int heap_maximum(int A[]); //返回优先队列的最大值2 3 i... 阅读全文
posted @ 2013-09-22 19:52 alan_forever 阅读(2243) 评论(0) 推荐(2) 编辑
摘要: 《算法导论》学习记录目录欢迎指出其中的错误和交流。关于堆排序的具体介绍和C代码实现见该链接。算导关于堆排序的练习主要是一些证明,可以帮助理解堆的特征。部分练习是图示过程,这些练习认真用笔过一次会很有收获。1.在高度为h的堆中,最多和最少的元素个数是多少?最多:底层全满;1 + 2^1 + 2^2 + ...... + 2^h,等比数列求和得2^(h+1) - 1最少:底层只有一个节点;1 + 2^1 + 2^2 + ...... + 2^(h-1) + 1,等比数列求和得2^h - 1 + 1 = 2^h2.证明:含n个元素的堆的高度为floor(lgn)假设n个元素的堆的高度为h。由上题得2 阅读全文
posted @ 2013-09-16 20:47 alan_forever 阅读(7179) 评论(2) 推荐(1) 编辑
摘要: 《算法导论》学习记录目录堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。二叉堆有两种:最大堆和最小堆。最大堆的特性是指除了根以外每个节点的值最多和其父节点的值一样大。堆可以被看成是一棵树,其高度为。(练习证明)保持堆的性质 1 /* 2 *这个函数是维持堆的性质,注意当调用这个函数的时候,我们假定该节点的左右儿子树都是最大堆。 3 *但是有可能该节点小于它的子树,所以通过这个函数使该节点下降,使以该节点为根的子树成为最大堆。 4 */ 5 void max_heapify(int A[], int length, int i){ 6 int l = 2 * i; ... 阅读全文
posted @ 2013-09-13 23:26 alan_forever 阅读(2587) 评论(2) 推荐(0) 编辑
摘要: 《算法导论》学习记录目录1、写出一个运行时间为的算法,使之能在给定一个由n个整数构成的集合S和另一个整数时,判断出S中是否存在有两个其和等于x的元素。首先对集合进行排序,用归并排序(),然后再从集合的第一个元素到最后一个元素,对集合进行二分查找,查找x减去该元素() 1 #include 2 #include 3 4 void merge(int A[], int p, int q, int r){ 5 int n1 = q - p + 1; 6 int n2 = r - q; 7 int i, j, k; 8 int *L = mallo... 阅读全文
posted @ 2013-09-02 18:14 alan_forever 阅读(1228) 评论(0) 推荐(0) 编辑
摘要: 《算法导论》学习记录目录插入排序是算导第一个分析的算法。之前看了很多遍,一直没有把习题做了,现在好好把习题和思考题做做,锻炼自己能力,顺便用C语言实现经典算法和数据结构。最基础的插入排序是对前n-1项数据进行反向扫描。实现很简单,运行时间也很容易的出,直接贴代码:void insertion_sort(int A[], int length){ int i, j; int key; for(j = 1; j = 0 && A[i] > key) { A[i+1] = A[i]; i--; } ... 阅读全文
posted @ 2013-09-01 14:43 alan_forever 阅读(7496) 评论(0) 推荐(0) 编辑
摘要: 主要初步介绍malloc、free、calloc、realloc的基本。日后会有更详细的内容。malloc、free分别用于动态内存分配和释放。malloc会从内存池里提取一块合适的内存(连续的),并返回指向这块内存(起始位置的指针,该指针的类型为void*指针(因为malloc不知道你请求的内存需要存储的数据类型),而且这块内存并没有初始化。如果操作系统无法提供给malloc足够的内存,malloc就会返回一个NULL指针。因此必须对每个从malloc返回的指针进行检查。1#include2#include34intmain()5{6int*pi;7inti;8pi=malloc(25*si 阅读全文
posted @ 2013-08-29 23:01 alan_forever 阅读(4411) 评论(0) 推荐(0) 编辑
摘要: 偶尔我们需要设计一些函数,它们的参数数目不是固定的,这样我们需要用到可变参数列表。可变参数列表是通过宏来实现的,定义于stdarg.h头文件。具体内容在《C与指针》1#include2#include34floataverage(intn_values,...)5{6va_listvar_arg;//用于访问参数列表的未确定部分,通过va_start来初始化7intcount;8floatsum=0;910/*11准备访问可变参数12*/13va_start(var_arg,n_values);//第一个参数为va_list变量的名字,第二个参数为省略号前最后一个有名字的参数。初始化过程把va 阅读全文
posted @ 2013-08-29 20:25 alan_forever 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <ctype.h> 4 5 int is_not_print( int ch ) 6 { 7 return !isprint( ch ); 8 } 9 10 static int(*test_func[])( int ) = {11 iscntrl,12 isspace,13 isdigit,14 islower,15 isupper,16 ispunct,17 is_not_print18 };19 #define N... 阅读全文
posted @ 2013-06-07 13:36 alan_forever 阅读(306) 评论(0) 推荐(0) 编辑
摘要: “堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树”“因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链”上面两句是摘自《数据结构与算法分析》书中代码的上滤和下滤的实现比算法导论的好,算法导论通过递归,每一次都交换不合适的节点,书本的代码则是通过循环找到节点正在要移动到的位置。参考算法导论的代码:http://www.cnblogs.com/alan-forever/archive/2012/09/26/2704860.html算法导论的是堆排序的代码,不过堆的性质都有的。下面的代码是最小堆的,而且是一个类模板。View Code .. 阅读全文
posted @ 2012-12-11 19:09 alan_forever 阅读(1532) 评论(0) 推荐(0) 编辑