初记 第二章 算法入门
鉴于双十一亚马逊的折扣,买了不少书,其中就有心仪很久的《算法导论》。
于是决定记录自己的阅读所得 = =b...
第二章 2.1 插入排序 INSERTION-SORT
其实以前学习数据结构的时候是学过这些的,不过又忘掉了而已,一直以来学得实在不用心,也并没有天赋。
插入排序算法是一个对少量元素进行排序的有效算法。其参数是一个数组A[1..n],输入的各个数字是原地排序(sorted inplace),意即这些数字就是在数组A中进行重新排序的,在任何时刻,至多只有其中的常数个数字是存储在数组之外的。
附伪代码2012-11-16
INSERTION SORT[A] for j <- 2 to length[A]{ do key <- A[j] //Insert A[j] into the sorted sequence A[1..j-1]. i <- j; while i>0 and A[i]>key do A[i+1] <- A[i] i <- i-1 A[i+1] <- key }
我盯着这个伪代码看了很久,真的看了很久,实际上,高中的时候在数学里就学过伪代码了,结果上大学了竟然没有丝毫的优势,这当然跟自己的不努力不在乎有很大的关联,如今都大三了,希望仍旧为时不晚才好。
分析了这个伪代码后,尝试着对一组数据进行排序:A=<5,2,4,6,1,3>
根据自己的分析,我认为一步一步地该这样走过来:
5 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | |||||||||||
2 | 5 | 4 | 4 | 4 | 4 | 1 | 2 | 2 | 2 | 2 | 2 | |||||||||||
4 | 4 | 5 | 5 | 5 | 1 | 4 | 4 | 4 | 4 | 3 | 3 | |||||||||||
6 | → | 6 | → | 6 | → | 6 | → | 1 | → | 5 | → | 5 | → | 5 | → | 5 | → | 3 | → | 4 | → | 4 |
1 | 1 | 1 | 1 | 6 | 6 | 6 | 6 | 3 | 5 | 5 | 5 | |||||||||||
3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 6 | 6 | 6 |
后来发现这与书上的分析有偏差,才发现我把伪代码的层次看错了,在执行了 i<-i+1之后跳回循环while,而不是跳到A[i+1]<-key, 所以正确的应该是直接插入到正确位置,也就是说:
5 | 2 | 2 | 2 | 1 | 1 | |||||
2 | 5 | 4 | 4 | 2 | 2 | |||||
4 | 4 | 5 | 5 | 4 | 3 | |||||
6 | → | 6 | → | 6 | → | 6 | → | 5 | → | 4 |
1 | 1 | 1 | 1 | 6 | 5 | |||||
3 | 3 | 3 | 3 | 3 | 6 |
并没有如我自己理解的一样那么多步。于是为了给自己开罪,我表示,这个书上的伪代码和我高中学的不一样嘛,嗯,确实有一定偏差,并且距离之前学习数据结构学习排序的算法时间已经过去了整整1年了。嗯,所以我没什么错。
2.1中还提到循环不变式,对于循环不变式,必须证明三个性质,即初始化、保持、终止。
初始化:它在循环的第一轮迭代开始之前,应该是正确的;
保持:如果在循环的某一次迭代开始之前它是正确的,那么,下一次迭代开始之前,它也应该保持正确;
终止:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
这个很好理解啊。
之后有提到指针,这真是痛心得很,记得指针是学C语言的后期学到的,当时在大学也有一段时间了,已经完全习惯要怎么在上课偷懒逃课玩手机游戏了,习惯怎么把别人的作业经过怎样的修改变成自己的了。好吧,就是这个样子,有什么办法呢。于是指针,至今也不明白。
用于表示一个数组或对象的变量被看作是指向表示数组或对象的数据的一个指针。对于某个对象x的所有域f,赋值y<-x就使得f[y]=f[x]。在赋值y<-x后,x和y指向同一个对象。
参数采用按值传递方式,实际传递的是一个指向该对象数据的指针,而对象的各个域则不被拷贝。
布尔运算符“and”和“or”都具有短路能力。eg:求"x and y",若x的值为false,则不再求y的值。
好吧,先就这样了。