专为手机号码设计的特殊的排序

打个比方说吧,某移动公司的数据库里存了移动用户的数据,有一项属性是用户的手机号码。现在要对这些号码进行排序,条件是,内存比较小,速度希望不要太慢。

我们来分析一下吧,中国的手机号码是11位的。其实在这里各位看官也可以自己先想想具体怎么实现,注意,不要用冒泡、快速等等,要-----非主流。

 书中用到的办法涉及到指针,因为我现在用c#更加顺手一点,所以我用数组的方式加以试验,意会即可:

1>取一数组,含有10^11(10的十一次幂)个元素的bool型 a[n](0<n<10^11)

2>初始值为false

3>遍历手机号码。手机号码=n时,将a[n]=true。

4>结束,重新遍历a[n],如果a[n]=true,输出n即可。

 

总结一下,使用上述排序的方式,肯定比冒泡排序要快的多,具体的特殊条件为

1<所排序数组为整数

2<所排序数组范围一定

3<数组没有重复值出现

 

现在来优化上述算法:

首先,中国移动的号码是大于等于13,400,000,000小于19,000,000,000的,我们首先缩小了数组的排序范围,这一步大约可以省下95%左右的数组空间。

紧接着,书上说是用位图或者位向量来解决(其实我不懂什么事位图什么是位向量),我们用字符串0111 0100 1000 0100 0000来表述数组{1,2,3,5,8,13},(个人感觉是不是用指针的话是不是好一点

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值