《编程珠玑(第2版•修订版)》—第1章1.3节程序设计

简介: 显而易见的方法是以一般的基于磁盘的归并排序程序为起点,但是要对其进行调整,因为我们是对整数进行排序。

本节书摘来自异步社区《编程珠玑(第2版•修订版)》一书中的第1章1.3节程序设计,作者【美】Jon Bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.3 程序设计
显而易见的方法是以一般的基于磁盘的归并排序程序为起点,但是要对其进行调整,因为我们是对整数进行排序。这样就可以将原来的200行程序减少为几十行,同时也使得程序运行得更快,但是完成程序并使之运行可能仍然需要几天的时间。

另一种解决方案更多地利用了该排序问题的特殊性。如果每个号码都使用7个字节来存储,那么在可用的1 MB存储空间里大约可以存143 000个号码。如果每个号码都使用32位整数来表示的话,在1 MB存储空间里就可以存储250 000个号码。因此,可以使用遍历输入文件40趟的程序来完成排序。在第一趟遍历中,将0至249 999之间的任何整数都读入内存,并对这(最多)250 000个整数进行排序,然后写到输出文件中。第二趟遍历排序250 000至499 999之间的整数,依此类推,到第40趟遍历的时候对9 750 000至9 999 999之间的整数进行排序。对内存中的排序来说,快速排序会相当高效,而且仅仅需要20行代码(见第11章)。于是,整个程序就可以通过一两页纸的代码实现。该程序拥有所期望的特性——不必考虑使用中间磁盘文件;但是,为此所付出的代价是要读取输入文件40次。

归并排序读入输入文件一次,然后在工作文件的帮助下完成排序并写入输出文件一次。工作文件需要多次读写。

图像说明文字


28cd0b28c718962cd5e83cfbc80ff4fce3e3995a

40趟算法读入输入文件多次,写输出文件仅一次,不使用中间文件。

29a4e2f621e70a230205c329c57aea69227cbbdb

下图所示的方案更可取。我们结合上述两种方法的优点,读输入文件仅一次,且不使用中间文件。

50c29b60366fba25d0ac3f46e3ca5df2aad62741

只有在输入文件中的所有整数都可以在可用的1 MB内存中表示的时候才能够实现该方案。于是问题就归结为是否能够用大约800万个可用位来表示最多1 000万个互异的整数。考虑一种合适的表示方式。
相关文章
|
存储 Java
Java面向对象程序设计综合练习2(填空题)(上)
Java面向对象程序设计综合练习2(填空题)(上)
649 0
Java面向对象程序设计综合练习2(填空题)(上)
|
11月前
|
调度 数据库
数据库系统概论第十一章习题
数据库系统概论第十一章习题
|
算法 C语言 索引
算法为何重要(《数据结构与算法图解》by 杰伊•温格罗)(下)
算法为何重要(《数据结构与算法图解》by 杰伊•温格罗)
70 0
|
机器学习/深度学习 算法 量子技术
数据结构为何重要(《数据结构与算法图解》by 杰伊•温格罗)
数据结构为何重要(《数据结构与算法图解》by 杰伊•温格罗)
89 0
|
Java
Java面向对象程序设计综合练习2(编程题)(上)
Java面向对象程序设计综合练习2(编程题)(上)
382 0
|
存储 物联网 Java
Java面向对象程序设计综合练习2(编程题)(下)
Java面向对象程序设计综合练习2(编程题)(下)
440 0
|
Java Python
Java面向对象程序设计综合练习1(选择题)(上)
Java面向对象程序设计综合练习1(选择题)(上)
447 0
Java面向对象程序设计综合练习1(选择题)(上)
|
SQL 存储 Java
Java面向对象程序设计综合练习1(选择题)(下)
Java面向对象程序设计综合练习1(选择题)(下)
885 0
Java面向对象程序设计综合练习1(选择题)(下)
|
SQL Java 数据库连接
Java面向对象程序设计综合练习4(填空题)(上)
Java面向对象程序设计综合练习4(填空题)(上)
136 0
|
算法 程序员
《编程珠玑(第2版•修订版)》—第2章2.1节三个问题
研究算法给实际编程的程序员带来许多好处。算法课教给学生完成重要任务的方法和解决新问题的技术。
1568 0