编程珠玑之第一章习题8:包含区号800、877,888情况下的排序测试用例

测试用例说明:这里测试用例的区号为:80、87、88;假设电话号码的范围是[0, 10000), 那么除去区号后其他号的范围就是[0, 100),设计程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>
#include <string.h>      /*memset*/
#include <stdint.h>      /*int64_t*/

#define  MAxNUM      10000    // 总数
#define  OTHERNUM    100      // 除去区号数
#define  BASENum     100 
#define  REGIONNUM   3        // 区号个数
#define  N           10

typedef  structunsigned  int bit: 1; } bitType;   // 占1位
typedef  struct
{
     unsigned  int bitsize: 10;     // 免费区号(最大999)
    bitType arrData[OTHERNUM];   // 其他位号码

} numData;


int main( void)
{
    numData theData = { 0};  // 初始化bitsize,arrData自动初始化
     //  memset(theData.arrData, 0, sizeof(theData.arrData));    // 数组清零

    int64_t a[N] = { 87808045876788808790
                     87878845801580568813};

     int regionNum;       // 区号
    int64_t otherNum;    // 其他号码
     for ( int i= 1; i <= REGIONNUM; i++)   // 免费区号数目
    {
         for ( int j= 0; j < N; j++)
        {
            regionNum = a[j] / BASENum;
            otherNum = a[j] - regionNum * BASENum;

             if (regionNum ==  80 && i== 1)
            {
                theData.bitsize = regionNum;
                theData.arrData[otherNum].bit =  1;      
            }

             if (regionNum ==  87 && i== 2)
            {
                theData.bitsize = regionNum;
                theData.arrData[otherNum].bit =  1;
            }


             if (regionNum ==  88 && i== 3)
            {
                theData.bitsize = regionNum;
                theData.arrData[otherNum].bit =  1;
            }           
        }

         for ( int k= 0; k < OTHERNUM; k++)
        {
             if (theData.arrData[k].bit ==  1)
                printf( "%d%ld\t", theData.bitsize, k);
        }
        memset(theData.arrData,  0sizeof(theData.arrData));     // 数组清零
    }


     return  0;
}
输出结果:


那么,在文本模式下如何在1MB完成所有排序呢? 由于每个区号之后其他数最大情况下有1000w个,相当于1.25MB,3个免费区号就是3*1.25MB,所以,可以采取多趟排序在分别获得了每个免费区号内的所有值之后,在将这些值按照多趟来予以排序。

如何实现快速查找呢?

由于我们已经对所有的数据进行了排序,所以可以使使用二分查找的方法以实现元素的准确定位。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值