位图排序的前提条件:
- 输入数据限制在较小的范围内;
- 数据没有重复;
- 每条数据单一,没有关联数据
位图排序的三个步骤:
- 将所有位初始为0;
- 读入整数建立集合,将每个整数的对应位置为1;
- 检验每一位,如果该位为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