编程珠玑——电话号码排序

文章探讨了如何在1M内存限制下对大约1000万个不重复的7位整数电话号码进行排序。提出了三种解决方案:1) 外存归并排序,通过多次读写操作完成;2) 分多次读取并排序;3) 使用Bitmap,将数字映射到二进制位,遍历输出。作者提供了Bitmap实现的代码示例,但表示代码可读性待改进。
摘要由CSDN通过智能技术生成

编程珠玑第一章,电话号码排序,问题是这样的,给你大约1000万个数字,让你用最快的方式进行排序,限制如下:

1. 内存大约1M

2. 数字都是整数,且不重复

3. 数字的范围最大是7位数。


文章提到了大约三种解法,

第一种是归并算法,只不过不在内存,在外存上做归并排序。大致思路是将原始文件读入,然后按照数字的大小划分10份,写到10个文件里。

这样每个文件就小于1M,然后对每个文件进行排序,排序之后,将文件合并。由于file1<file2<...<file10。所以合并很简单,直接依次读一遍,再写文件即可。

读次数:1+10+10

写次数:  10+10+1


第二种二种比较傻,分多次读,每次只读i~ j的数字,然后对其排序,并输入到文件。这个方法不再赘述。


第三种就是使用bitmap,思路就是把一个32位的整数用来存32个数字,比如,如果数字i出现了,则该数的二进制的第i位为1,否则为0。这样1000万个数字大约要1.25M.

首先读入所有的数字,存入bitmap,然后遍历bitmap,如果第i位为1,表示出现过,则输出到文件,否则,不输出。

首先贴上自己的代码,写的不是很简洁,代码能力有待提高:

#include <iostream>
#inc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值