《算法(第4版)第2章:排序》学习笔记

来源:互联网 发布:东方仿真软件下载 编辑:程序博客网 时间:2024/06/06 16:31
2.1 初级排序

P153Comparable[W用1] 接口强行对实现它的每个类的对象进行整体排序。排序的标准是必须复写的compareTo()方法。

P154:算法模板中的Comparable是指实现了Comparable接口的数据类型。Java中的IntegerDoubleStringFileURL等都实现了Comparable接口。

P154Java惯例:compareTo()方法返回的是+1-10三种结果。

P157:算法2.2循环部分理解:对第i个数据,因为前i-1个数据是有序的,例如{1,2,4,3,5…}中的第4个数据。对第i个数据进行插入排序时,是先与第i-1个数据进行比较,小于则交换,再与第i-2个数据交换,大于则已经正确插值;小于则继续。

P156:选择排序:从i=1开,选择最小的元素放在前面。

P157:插入排序:对于第i个元素,依次与左边的元素比较,若左边的元素大于该元素,则交换,直至到达顺序排放的位置,相当于将i元素位置到顺序位置之间的所有元素右移一位,然后将该元素插入顺序位置的操作。优点:充分利用输入元素的初始顺序。

 

 

程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内在的分配,有六个地方都可以保存数据:

1、寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。

2、堆栈。驻留于常规RAM(随机访问存储器)区域。但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些java数据要保存在堆栈里——特别是对象句柄,但java对象并不放到其中。

3、堆。一种常规用途的内存池(也在RAM区域),其中保存了java对象。和堆栈不同:“内存堆”或“堆”最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相碰的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间

4、静态存储。这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但java对象本身永远都不会置入静态存储空间。

5、常数存储。常数值通常直接置于程序代码内部。这样做是安全的。因为它们永远都不会改变,有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。

6、非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器,而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技艺就是它们能存在于其他媒体中,一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。[W用2] 

 

P171Java中的static关键字解析:https://www.cnblogs.com/dolphin0520/p/3799052.html个人认为算法2.4aux数组定义为static是为了所有的Merge对象都使用一个aux数组,从而节省存储空间。但也仅仅节省一个引用的空间,所以还是有点疑问。。。。。。打脸:编程的时候不定义为static对象会报错,引用的时候说是不能使用非静态对象。

P175:算法设计的分治思想:将一个大问题分割成小问题分开解决,然后用所有小问题的答案来解决整个大问题。

2.4 优先队列

P205:public static void merge(In[] streams){…}中地stream[i]代表的是第i个输入流;对应接下来的例子就是对应第i个文本,而且In类的readString方法在读出一个数据的同时,指针就移向下一个数据。所以merge方法才能读取三个有序的文本并输出成一个有序文本。

P207: 堆有序,当一棵二叉树的每个结点都大于等于它的两个子结点时,它被称之为堆有序。

P208:堆排序是目前所知的唯一能够同时最有地利用空间和时间的方法;但无法利用缓存(p.s.:不方便插入新元素)。

P202MaxPQ<Key extendsComplarable>使用:

例: MaxPQ<Dog> pq1 = new MaxPQ<>(N) ;

其中Dog类自定义,而且必须实现comparable接口,必须复写compareTo方法,否则报错;

常用的DoubleInteger等都实现了comparable接口,但是不能是doubleint

P217Comparator的使用尚有疑问

P217:如果一个算法能够保留数组中重复元素的相对位置则可以被认为是稳定的。(插入排序和归并排序

P219:快速排序是最快的通用排序方法。Reason:内循环指令少。且能利用缓存。

如果稳定性很重要很空间不是问题的话,归并算法可能是最好的。

JavaArrays.sort()实现:对基础数据类型使用三向切分快速排序(速度),对引用类型使用归并排序(稳定性)。


 [W用1]参考:http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822251.html

 [W用2]http://bbs.csdn.net/topics/370001490

原创粉丝点击