快速排序

在比较算法中,快速排序可以算是明星算法了,因为他的常系数小,使得其总体性能比其他比较算法优秀。其性能基本上可以达到$\theta (n\lg n)$ ,但在某些极端情况其时间复杂度却是$\theta ({n}^{2})$。 快速排序的基本思想是遵循分而治之的思想的,其基本思路是: 分:在待排序的数据中选取一个数作为中心点,大于这个数的数统统放到右边,小于这个数的统统放在左边。这样就形成了左右两个子串。 治:两个子串重复1的动作 合并:无 ##分 所以最重要的是分这一步,这一步的伪代码如下 :::c Partition(A,p,q) // A[p,q] x<-A[p] i<-p for j<-p+1 to q do if A[j] <= x // <= 是小于等于的意思 then i<-i+1 exhange A[i]<->A[j] exchange A[p]<->A[i] return i 时间复杂度为$\theta(n)$ 下面给出一个例子,看如何分。 Ex. :::java 6 10 13 5 8 3 2 11 选取 pivot=6 i=0 j=1 :::java 6 10 13 5 8 3 2 11 pivot=6 i=0 j=3 i=i+1 -> i=1 exchange A[i]<->A[j] so: :::java 6 5 13 10 8 3 2 11 此时 i=1,j=3, 继续 :::java 6 5 13 10 8 3 2 11 i=1,j=5 i=2 exchange A[i]<->A[j] :::java 6 5 3 10 8 13 2 11 i=2,j=5 j继续自增 :::java 6 5 3 10 8 13 2 11 i=2,j=6 i=3 exchange A[i]<->A[j] :::java 6 5 3 2 8 13 10 11 i=3,j=6 直到结束,然后 exchange A[p]<->A[i] : A[0] <-> A[3] , 最后结果为 :::java 2 5 3 6 8 13 10 11 这样以6为轴,比6小的都在左边,比6大的都在右边,分结束。 ...

July 29, 2013

愣头青

标题的三个字,我一直打不出来,真是个没有自知之明的家伙。使用上十八般武艺,才得到 lèng tóu qīng 三个拼音和一个解释。 愣头青,是我们生活中常用的一个词,说的是某人做事情没有脑子,或不动脑子,从来不对事情的内容性质是非曲直等情况做分析判断就盲目采取行动,结果,因为用于行动的手段和事情发展的状况相矛盾,最后将不起眼的小问题变成了后果严重的大问题,好事变成了坏事。 这个形容对于我来说真的非常贴切。可悲的是,常常因为这个原因惹怒了女朋友大人。这次也是。 很多事情往往事后才反省,没有及时抓紧机会,最后换来一句:“you always miss chance”。直插要害,情绪几近失控。 在经历了一次失败挫折后,很快也要面临另一个chance,可是由于上一次的失败,我退缩了。因为害怕再次失败。而这次如果失败,后果与上一次不一样,可能会改变终生,我还不想落个终身遗憾。也正是这个思想,使我举棋不定。是做,还是迟一些再做? 失败后总要找些原因吧,是性格问题?是计划问题?被这样反问着。我觉得是态度问题。 今晚没什么心思看英语,打开了一个又一个的别人的博客看。看着看着,不禁陷入了沉思,不禁问起自己这三个清华保安的哲学问题:你是谁?你来自哪里?你将要去哪里? 是什么博客令我有这样的沉思? 一个是:最好金龟换酒,博客主据说是夫妻档,傅真,伦敦金融离职者,毛铭基,工程师。他们的博客告诉我什么是爱情,他们的书《藏地白皮书》,听说是个比童话更童话的日记。 另一个是西乔的两篇报道《西乔:我在过着很奢侈的生活》和《西乔的新出发:去往墙外》,在看这两文章之前我不知道谁是西乔,但是看过她画的漫画,她的思想我是很赞同的,也感到自己非常惭愧。 有意思的是夫妻档这两个博客主在结束gap year后将回国发展,西乔却要去加拿大,究竟他们以后的发展会怎样呢? 我自己呢?

July 26, 2013

cunit单元测试

以md5测试为例子,练习了cunit这个单元测试工具。 要写一个测试用例,只需要遵循用例的框架编写就好了。 我们应该要清楚自己编写的函数的输入是什么,输出是什么。然后使用cunit的断言看结果是否符合预期,是的话测试通过,否则说明编码有问题。 就这次将要编写的md5为例,需要测试两个函数,一个是输入字符串,输出计算后的md5值,另一个是输入文件路径,输出文件的md5值。所以用例是否通过的条件就是计算的md5值是否正确。 先来看看main函数 :::c int main(int argc, const char *argv[]) { return run_test(); } 没什么特别的,就是运行了run_test这个函数。 再来看看run_test :::c int run_test() { if(CU_initialize_registry()) { exit(EXIT_FAILURE); } else { AddTests(); /**** Automated Mode ***************** CU_set_output_filename("TestMax"); CU_list_tests_to_file(); CU_automated_run_tests(); //************************************/ /*********basic mode**************/ // CU_basic_set_mode(CU_BRM_VERBOSE); // CU_basic_run_tests(); /*********console mode**************/ CU_console_run_tests(); CU_cleanup_registry(); return CU_get_error(); } } 开始变得有趣了,我们看到运行cunit,先要执行CU_initialize_registry(),成功后运行我们写的AddTests添加测试用例,接着运行测试模式,这里有三种,我用了第三种控制台模式。最后return退出。 接着来看看我们的AddTests做了什么工作。 :::c void AddTests() { assert(NULL != CU_get_registry()); assert(!CU_is_test_running()); if(CUE_SUCCESS != CU_register_suites(suites)) { exit(EXIT_FAILURE); } } 原来AddTests的动作就是注册suites。那么什么是suites? ...

July 25, 2013

GIT速查表与实践

pdf 下载地址:https://dl.dropboxusercontent.com/u/41178008/Git_Cheat_Sheet__grey.pdf

July 1, 2013

吃素-的世界

素食的经历还停留在小时候,因为那时经常跟着婆婆去各个寺庙。 个人不是一个素食者,却对素食颇有兴趣,尤其是对于那些可以把素装成肉的菜式。 在女朋友的提议下来到广州的佛世界素食社-一家老牌素食馆-体验了一下素菜。 ##第一道菜是这个 忘记名字了。什锦煲之类的,味道刚好。感觉上加点咸鱼就成那啥煲了。 ##第二个菜 各种菌,也是味道不错的,想起某个菌的广告了。你今天吃了吗? ##能填肚子的主食 这是煎面,没错是煎的。里面还有鱼丸片,没错是鱼丸片,素的吧,分不清了,世界观被颠覆了。

June 27, 2013