摘要:
我们都知道,当原序列基本已经有序了的时候,采用插入排序的话其效率可以达到线性。但一般情况下插入排序的效率并不高。而希尔排序正是对它的一种改进。希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。下面具体来说说希尔排序的思想:假设一个数组如下:2 43 12 32 9 10 8 7 45 3, 此时数组长度 len = 10;第一步:此时 gap = 10 / 2 = 5。所以此时进行排序的组合为: . 阅读全文
摘要:
归并排序是分治法的一种体现,建立在归并操作上。归并排序的思想是将一个数组分成两部分A,B,如果A, B是有序的,那只要将A, B合并起来即可,那么如何保证A, B是有序的呢?那就将A, B按一样的方法各自分成两部分...如此到当分出来的A, B都只有一个元素的时候,A, B都是有序的了。这就是分治法的一种体现。这样因为A, B都是有序的,合并起来后就是一个完整的有序序列了。那么,改如何进行合并?他的思想是:先新开一个大小为A, B大小之和的数组cSeq,设两个指针a, b分别指向A, B的第一个元素,然后将a, b正想的元素较大的那个赋到cSeq。并将指向较大的那个的指针指向下一个....如此 阅读全文
摘要:
今天无聊就打算把所有的排序算法都看一遍。。。计数排序的时间复杂度是O(n),在算法导论中,用决策树模型中论证了,比较排序的情况为nlogn的复杂度。而计数排序的时间复杂度小于他的原因就是它不需要进行比较。计数排序的原理就是根据原数组(A)里面最大的元素来一个与其一样大的数组(B),新开的数组(B)的第 i 个元素的值就是 i 在原数组(A)里面出现的次数.这样就可以根据新开的数组(B)来确定原数组(A)的排序。我们先来看看排序部分的实现:(len是数组的长度)void countSort(int *arrayL, int len) { int findMax = 0; ... 阅读全文
摘要:
很早以前看过快排算法觉得自己掌握了,,课今天用的时候发现老出错,认真想想发现自己一直搞错了。。。下面先说一下我的想法:首先,快排的思想就是从数列中挑出一个元素,称为 "基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序那么这里需要考虑的就是如何进行分区,这个是最重要的,先来看看我的分区的实现:(这里的provit我就不用随机数来 阅读全文
摘要:
今天做web的测验。。坑爹的要用tornado。。。作为一个比较新的用的人还不多的东东。。。查资料好麻烦。。下面是当用户输入非法 url时, 显示一个自定义 404 页面提示用户,其访问的页面不存在。两个html文件就可以自己写了。。。简单来说,执行 RequestHandler 的 _execute() 方法(内部依次执行 prepare()、get() 和 finish() 等方法)时,任何未捕捉的错误都会被它的 write_error() 方法捕捉,因此覆盖这个方法即可:class RequestHandler(tornado.web.RequestHandler): def wr... 阅读全文