文章分类 -  Program Day by Day

摘要:网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5种实现方法(有两种解法相关性比较大)。 阅读全文

posted @ 2005-07-19 15:53 k_eckel's mindview 阅读(13283) 评论(0) 推荐(1)

摘要:单链表的逆转过程的关键是3个指针:一个记录当前逆转节点的前一个节点,一个记录当前逆转节点的下一个节点,另外一个则记录当前的逆转节点。 阅读全文

posted @ 2005-07-19 09:49 k_eckel's mindview 阅读(2739) 评论(1) 推荐(0)

摘要:快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程Partition,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最右端的元素。 Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。 阅读全文

posted @ 2005-07-17 11:09 k_eckel's mindview 阅读(559) 评论(2) 推荐(0)

摘要:堆排序的过程就是不断建堆的过程:1)初始化得到初始堆;2)将堆顶元素和堆中最后元素交换,在构建堆。注意到这个交换过程除堆顶元素破坏堆,并不会影响堆(原因:堆顶元素或是最大,或是最小)。 因此堆排序有关键是两个建堆函数:自底向上堆化和自顶向下堆化,分别对应代码中FixUp()和FixDown()。需要注意的是:为了方便堆的操作,我们一般将N+1个元素的数组的第一个元素不用,使用1到N的元素... 阅读全文

posted @ 2005-07-17 10:57 k_eckel's mindview 阅读(913) 评论(0) 推荐(0)

摘要:冒泡排序和选择排序是排序算法中比较简单和容易实现的算法。冒泡排序的思想为:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到数组的最右(左)端。而选择排序的思想也很直观:每一次排序过程,我们获取当前没有排好序中的最大(小)的元素和数组最右(左)端的元素交换,循环这个过程即可实现对整个数组排序。两者的实现源码为: 阅读全文

posted @ 2005-07-17 10:50 k_eckel's mindview 阅读(1333) 评论(1) 推荐(0)

摘要:插入排序的思想很简单:假设前N-1个数据已经排好序了,第N个数据插到前面已经排好序的数组中。这和生活中一件事情有着异曲同工之妙:玩扑克牌的时候,很多人(包括我)都会按照花色从大小(或反之)进行排序,而每次再拿到新的牌,则插入到合适的位置,其实这就是插入排序的思想。 因此插入排序的过程可以分为两个步骤:1)找到新元素的插入位置;2)将将元素插入到1)中确定的位置,这就需要移动元素了。1)中确定位置我们可以采用简单的顺序遍历的方法得到,但是注意到由于前N-1个元素已经排好序,因此可以使用二分查找的方式实现。前者就是普通的插入排序,而后者就是二分插入排序。 阅读全文

posted @ 2005-07-17 10:29 k_eckel's mindview 阅读(439) 评论(0) 推荐(0)

摘要:计算机的最重要的功能就是用来处理信息的,而涉及到对信息的处理,查找和排序则是其中最为重要的条目。这也难怪一代算法宗师Knuth在其7卷(拟)的巨著《The Art of Programming》中整整第三卷就是查找与排序了。 这里尽量以较为正规的代码风格的代码将这些经典的排序和查找算法描述出来,目的无他,温故而知新。 u 几个要用到的函数 1) 随机产生测试... 阅读全文

posted @ 2005-07-16 17:11 k_eckel's mindview 阅读(506) 评论(0) 推荐(0)

摘要:于是我给自己定义了一个“Program Day by Day”的任务,一天一天学习,一天一天实在,一天一天精进。Program Day by Day我会尽量做到名副其实——每天Program,而Code的内容更多将会focus到最基础也是最重要的基本算法,数据结构中去,当然也会有诸如设计模式、具体问题的解决等等。当然这里面的很多东西,都应该是自己在N(N不知道等于几)年前的任务,于是现在再实现的时候,我会注意代码的风格,实现的本质等等。而这一切,在我看来,既是对往日的补过,更是对未来的期许。 Program Day by Day, and make progress everyday! 阅读全文

posted @ 2005-07-16 15:48 k_eckel's mindview 阅读(387) 评论(0) 推荐(0)