摘要: 第九章 中位数和顺序统计学9.1 最小值和最大值在一个有n个元素的集合中,要做多少次比较才能确定其最小元素呢?可以很容易地给出n-1次比较这个上界:依次查看集合中的每个元素,并记录比较过程中的最小元素。同样道理,最大值也可以通过n-1次比较找出来。这个算法比较简单,我就没有写程序实现了。在某些应用中,必须找出n个元素集合中的最大值和最小值。按照上面的思路,可以对目标数组进行两次扫描,便可独立得到最小值和最大值。但这是不是最优的算法呢?事实上,至多3floor(n/2)次比较就足以同时找出最大值和最小值。做法是记录比较过程中遇到的最小值和最大值。并不是将每一个输入元素与当前的最大值和最小值分别进 阅读全文
posted @ 2012-06-07 11:18 止於至善 阅读(1924) 评论(0) 推荐(1) 编辑
摘要: 第八章 线性时间排序8.4 桶排序桶排序的思想就是把区间[0, 1)划分成n个相同大小的子区间,每一个区间称为桶(bucket)。然后,将n个输入数据分布到各个桶中去。因为输入数均匀且独立均匀分布在[0, 1)上,所以一般不会有很多数落在一个桶中的情况。为得到结果,先对各个桶中的数进行排序,然后按次序把各个桶中的元素列出来即可。在桶排序算法中,假设输入的是一个含n个元素的数组A,且每个元素满足0≤A[i]<1。另外,还需要一个辅助数组B[0..n-1]来存放链表(桶),并假设可以用某种机制来维护这些表。BUCKET-SORT(A)1 n ← length[A]2 for i ← 1 to 阅读全文
posted @ 2012-06-06 21:30 止於至善 阅读(1637) 评论(1) 推荐(0) 编辑
摘要: 第八章 线性时间排序8.3 基数排序算法导论上对基数排序的算法描述只有两行。。。 微言大义的说。。。RADIX-SORT(A, d)1 for i ← 1 to d2 do use a stable sort to sort array A on digit iC++代码 1 #include <iostream> 2 3 using namespace std; 4 5 //求数组中数字的最大位数 6 int maxDigit(int* arr,int digit) 7 { 8 int n = 0; 9 int* temp = new int[digit];10 ... 阅读全文
posted @ 2012-06-06 15:13 止於至善 阅读(714) 评论(0) 推荐(0) 编辑
摘要: 第八章 线性时间排序8.2 计数排序这个算法比较简单。计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。然后就可以把x直接放到它的最终输出数组的位置上。例如如果有17个元素小于x,则x旅游属于第18个输出位置。假定输入的日企 数组A[1..n],length[A]=n。另外还需要两个数组:存放排序结果的B[1..n],以及提供临时存储区的C[0..k]。COUNTING-SORT(A, B, k)1 for i ← 0 to k2 do C[i] ← 03 for j ← 1 to length[A]4 do C[A[j]] ← C[A[j]] + 15 for... 阅读全文
posted @ 2012-06-05 18:57 止於至善 阅读(1273) 评论(0) 推荐(1) 编辑
摘要: 第七章 快速排序主要分为两个子算法,PARTITION(A, p, r)以A[r]为基准对数组进行一个划分,比A[r]小的放在左边,比A[r]大的放在右边。QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完成快速排序的过程。快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn)。最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候。在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),但是快速排序的常数项较小,所以要优于堆排序。PARTITION(A, 阅读全文
posted @ 2012-06-05 08:23 止於至善 阅读(1731) 评论(10) 推荐(1) 编辑
摘要: 第六章 堆排序主要分为三个子算法。算法MAX-HEAPIFY(A, i)为调整堆,算法BUILD-MAX-HEAP(A)为建堆,算法HEAPSORT(A)为堆排序。运行环境Code::Blocks 10.05。MAX-HEAPIFY(A, i) 1 l ← LEFT(i) 2 r ← RIGHT(i) 3 if l ≤ heap-size[A] and A[l] > A[i] 4 then largest ← l 5 else largest ← i 6 if r ≤ heap-size[A] and A[r] > A[largest] 7 then largest ← r 8.. 阅读全文
posted @ 2012-06-04 23:08 止於至善 阅读(1249) 评论(0) 推荐(1) 编辑
摘要: 第二章 算法入门两个有序数组的合并这个算法我的实现跟算法导论上的实现有些许区别。我没有使用《算法导论》上的哨兵位的方法。而且直接判断有没有到数组的末尾。不过为了跟书上保持一致,我的伪代码还是使用算法导论上的伪代码。算法描述:MERGE(A, p, q, r)是把存储在A[p...q]和A[q+1...r]这两部分中的有序子序列合并到A[p...r]并使其有序。两个子数组的长度分别为int n1=q-p+1;int n2=r-q; 建立两个新数组L和R,用于分别存放原数组的两个有序部分。分别遍历两个新的数组L和R,依次比较其中元素,将其中较小的元素存放到原数组A的对应位置。L和R中任何一个数组遍 阅读全文
posted @ 2012-06-02 16:11 止於至善 阅读(1823) 评论(2) 推荐(2) 编辑
摘要: 过几个月要面试了,最近在看《算法导论》,想把里面的算法都用C++实现一遍。今天是第一个算法,比较简单。第二章 算法入门插入排序伪代码实现INSERTION-SORT(A) 《算法导论》P101 for j ← 2 to length[A]2 do key ← A[j]3 //Insert A[j] into the sorted sequence A[1 ‥ j - 1].4 i ← j - 15 while i > 0 and A[i] > key6 do A[i + 1] ← A[i]7 ... 阅读全文
posted @ 2012-06-02 08:15 止於至善 阅读(1716) 评论(2) 推荐(3) 编辑
摘要: (一)Linux网络编程--网络知识介绍1、客户端和服务端网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端。2、客户端在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。比如我们使用ftp程序从另外一个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件),所以这个地方我们的ftp程序就是客户端程序。服务端和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。3、互为客户和服务端实际生活中有些程序是互为 阅读全文
posted @ 2012-05-13 14:27 止於至善 阅读(541) 评论(0) 推荐(0) 编辑
摘要: Python官方文档里是这样说的:xrange([start,] stop[, step])This function is very similar to range(), but returns an ``xrange object'' instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously. The advantage 阅读全文
posted @ 2012-04-27 18:36 止於至善 阅读(2763) 评论(3) 推荐(3) 编辑