FunctionGHW

立志成为真正程序员的码农,伪全栈,目前主要写C#

归并排序(Merge Sort)是分治法的一个典型应用,相对于冒泡排序、插入排序和选择排序,其性能上有所提升,同时也是基于比较的排序算法中最好的算法之一。

归并排序的步骤如下:

  1. (Divide):将待排序序列(原问题)分成两个规模大致相等的子序列(子问题)
  2. (Conquer):递归地排序两个子序列,当子序列规模足够小的时候直接完成排序
  3. (Combine):合并两个已序的子序列得到原序列的排序结果
此算法中分解问题的过程类似于二分,关键步骤在合并。当分解出的子序列只有一个元素时,视为已序序列。

 

继续阅读

C语言通用数据结构_Hashtable

散列表(hash table)是一种仅支持 增,删,查 操作的集合,理想情况下, 查找一个元素的期望时间是\(O(1)\),因为我们在散列表中通过关键字key查找value, 就好像在数组中通过下标查找对应的值一样。算法导论上说:"散列表是普通数组概念的推广"。

继续阅读

C语言通用数据结构_LinkedList

此链表为双向链表(Doubly-Linked List),LinkedList的声明稍微奇葩了些, 主要是为那些频繁的反复的插入节点和删除节点的应用而优化。对于其他的情况,性能应该会低一些。

设计思路是:如果删除了一个节点, 并不会立即free掉此节点,而是扔到节点池(nodes pool)里,等到创建新的节点时, 直接拿出来用而不用开辟新的空间,从而避免频繁的malloc操作,节点池其实就是个单向链表 (尽管里面的节点都有next和prev指针,我们只使用next)。一个明显的副作用就是空间开销可能会大些, 因此节点池的大小需要设置的合理些。

继续阅读

记得某本书上好像写过:C语言设计的理念是: 小即是美。不管他美不美吧, 反正他确实是个很小巧的语言。 也许就是因为"小"吧,在使用C的时候很多东西都是需要自己去代码实现,比如一些常用的数据结构, 真是烦透了。但是自己写的往往都是针对特定数据类型的,不够通用。可惜C没有泛型, 如果为每一个类型单独实现一套数据结构的库,估计是要疯掉了。看过一些库函数的声明之后, 得到了一点启发——把所有类型的数据都看作字节块,从而模拟泛型。 不过这样数据的类型在存取的过程中也就"丢失"了,因此我们需要自己去处理类型转换问题。 当然,为了实现通用性,我想"泛型"的性能可能会低一些。

继续阅读

最近两个星期,用C语言写了几小段示例代码,外加几个算法题的实现, 无奈自身水平捉鸡,总是出错问题,尤其是有指针的地方,每次都要调试好大一会儿,当真是苦不堪言啊。 C语言确实是小巧而又强大,不过也是让人又爱又恨。水平低如我等目测是没办法在大学期间搞定它了。 为了生存,还是先学点C#,python之类的语言吧<^_^>。

正文

题目大概是这样的:
已知两个给定的整数数组,数组长度都是n, 记为x[n], y[n]。 两个数组已被排序(升序),求这2n个整数的中位数。

继续阅读

这几天浏览了很多人的博客,发现似乎有这么个规律: 大神的blog中代码很少甚至没有一行代码,且大多是写一些认真思考出来的东西, 而像我这样的新手blog好多都是"贴代码",有时候连两句"废话"都懒得扯。

莫非水平越高 代码 在博客内容中所占的比例就越少? 那就努力多写点思考的"成果"吧,也许这就是 大神之路 吧。

正文

这次整理的是我第一次用C写的文件复制程序。 那时候为了理解 流(Stream) 这个东西也算是费了心思了, 印象最深刻的便是把 流 比作 管道,数据通过管道流通。 到现在也不敢说完全理解,对新手而言,抽象的概念远不如具体的代码让人安心。

对这些抽象的概念,我的一点点体会就是, 一时不能理解没什么关系,多写代码体验一下,多思考,慢慢的也就悟出来了. 也许就像在 《.Net4.0面向对象编程漫谈》 一书中听金老师说的那样: 学习编程,大家都在"盲人摸象"。 我想,摸得多了,也就知道"大象"是什么样了。

继续阅读

最近整理旧blog的时候一直在想:要不要带上原文链接。现在决定还是加在文章最后吧,既然是自己写的(尽管很水),那么就留着对比一下吧,看看整理后的文章有多少提高。

 

这次的也是《数据结构基础(C语言版)(第2版)》(Fundamentals of Data Structures in C, 2nd)的一个练习题:给定n个布尔变量,打印所有可能的真值组合。 相当于求长度为n的位串有多少种。旧文用的方法太蛋疼了,位串长度稍稍增大,运行时间就变得不可接受了(那个时候还是图样啊),现在我尝试着写个好一点的。

继续阅读

[旧文整理]Horner规则的小题目

本来打算最近好好整理几篇博客的,但是最近忙于学校的实习(其实感觉就像报了个培训班),蛋疼死了。看着博客那么空就先整理篇简单的吧,呵呵。

《数据结构基础(C语言版)(第2版)》(Fundamentals of Data Structures in C, 2nd) 看到的一个小题目——Horner规则。一个递归版本,一个迭代版本,原来是两篇博文(好吧,纯属凑数)。不过这个递归算是我首次尝试写递归程序了。其实感觉迭代比递归更好,毕竟程序太小。重在思想吧,递归的形式确实简洁点。

继续阅读