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

本文介绍了一种针对特定电话号码的排序与查找方法。通过设计结构体存储区号和其他号码部分,并利用二分查找实现快速定位。适用于处理大量电话号码数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试用例说明:这里测试用例的区号为: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,所以,可以采取多趟排序在分别获得了每个免费区号内的所有值之后,在将这些值按照多趟来予以排序。

如何实现快速查找呢?

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





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值