位图排序

位图排序的前提条件:

  1. 输入数据限制在较小的范围内;
  2. 数据没有重复;
  3. 每条数据单一,没有关联数据

位图排序的三个步骤:

  1. 将所有位初始为0;
  2. 读入整数建立集合,将每个整数的对应位置为1;
  3. 检验每一位,如果该位为1,就输出对应的整数,由此可得有序的输出。

实现:

#include <vector>
#include <iostream>
//template <typename Type>
class Bit 
{
        public:
                enum {MASK=0x1F};
                Bit()=default;
                Bit(const std::vector<int>& cvec, int max)
                :bit(max/ 2^5 + 1, 0),sourcedata(cvec),
                lshift(5),end(max)
                {    
                }   
                //在位数组bit中设置第i位为1     
                void set(int i)  
                {   
                        bit[i >>lshift] |= (1 << (i & MASK));
                }   
                //取消第i位的设置
                void clr(int i)
                {   
                        bit[i>>lshift] &= ~(1 << (i & MASK));
                }   
                //测试第i位是否为1
                int test(int i)
                {   
                        return bit[i>>lshift] &(1 << (i & MASK));
                }   
                   //bit第i位为1,则将i放入到destdata并返回destdata
                std::vector<int> bitSort()
                {
                        std::vector<int> destdata(0);
                        for (std::vector<int>::const_iterator citer = sourcedata.cbegin();
                         citer != sourcedata.cend(); citer++)
                                set(*citer);
                        for (int i = 0; i <= end; i++)
                        {
                                if (test(i))
                                        destdata.push_back(i);
                        }

                        return destdata;
                }
        private:
                std::vector<int> bit;
                std::vector<int> sourcedata;
                int lshift; //左偏移量,end/2^lshift 
                int end;
};

测试程序:

#include "Bit.h"
int main()
{
        std::vector<int> vec = {3,10,6,2,1};
        Bit bit(vec, 10);
        std::vector<int> sortvec = bit.bitSort();
        for (std::vector<int>::const_iterator citer = sortvec.cbegin(); 
        citer != sortvec.cend(); citer++)
                std::cout<<*citer<<std::endl;

        return 0;
}

输出:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值