鏃犲績鍦ㄨ繖閲宑opy/paste浣嶅浘鎺掑簭鐨勫叿浣撹В閲婏紝濡傛灉鏈夌煡閬撳緱涓嶈緇嗙殑錛岃璁塊棶Wikipedia銆?br />聽聽1聽#ifndef聽_BITMAP_HPP_INCLUDED
聽聽2聽#define聽_BITMAP_HPP_INCLUDED
聽聽3聽
聽聽4聽#include聽<cstring>聽//for聽memset
聽聽5聽
聽聽6聽
聽聽7聽namespace聽feng
聽聽8聽{
聽聽9聽
聽10聽template<typename聽Type>
聽11聽class聽Bitmap_Sort
聽12聽{
聽13聽聽聽聽聽聽聽聽聽typedef聽Type聽template_type;
聽14聽聽聽聽聽private:
聽15聽聽聽聽聽聽聽聽聽struct聽_Bitmap_Impl;
聽16聽聽聽聽聽聽聽聽聽_Bitmap_Impl*聽bi_;
聽17聽聽聽聽聽public:
聽18聽聽聽聽聽聽聽聽聽Bitmap_Sort(聽const聽template_type&聽lower聽=聽1,聽const聽template_type&聽upper聽=聽100聽)
聽19聽聽聽聽聽聽聽聽聽{
聽20聽聽聽聽聽聽聽聽聽bi_聽=聽lower聽<聽upper聽?
聽21聽聽聽聽聽聽聽聽聽聽聽聽聽new聽_Bitmap_Impl(lower,upper)聽:聽
聽22聽聽聽聽聽聽聽聽聽聽聽聽聽new聽_Bitmap_Impl(upper,lower);
聽23聽
聽24聽聽聽聽聽聽聽聽聽}
聽25聽聽聽聽聽聽聽聽聽~Bitmap_Sort()
聽26聽聽聽聽聽聽聽聽聽{
聽27聽聽聽聽聽聽聽聽聽delete聽bi_;
聽28聽聽聽聽聽聽聽聽聽}
聽29聽
聽30聽聽聽聽聽聽聽聽聽void聽process(聽const聽template_type&聽v聽)聽const
聽31聽聽聽聽聽聽聽聽聽{
聽32聽聽聽聽聽聽聽聽聽聽聽聽聽(*bi_).register_number(聽v聽);
聽33聽聽聽聽聽聽聽聽聽}
聽34聽
聽35聽聽聽聽聽聽聽聽聽template<typename聽Input_Itor>
聽36聽聽聽聽聽聽聽聽聽void聽process(聽Input_Itor聽begin,聽Input_Itor聽end聽)聽const
聽37聽聽聽聽聽聽聽聽聽{
聽38聽聽聽聽聽聽聽聽聽while聽(聽begin聽!=聽end聽)
聽39聽聽聽聽聽聽聽聽聽聽聽聽聽(*bi_).register_number(聽*begin++聽);
聽40聽聽聽聽聽聽聽聽聽//including聽<algorithm>聽is聽not聽of聽necessity
聽41聽聽聽聽聽聽聽聽聽//for_each(聽begin,聽end,聽&((*bi_).register_number)聽);聽
聽42聽聽聽聽聽聽聽聽聽}
聽43聽
聽44聽聽聽聽聽聽聽聽聽template<typename聽Output_Itor>
聽45聽聽聽聽聽聽聽聽聽Output_Itor聽produce(聽Output_Itor聽begin聽)聽const
聽46聽聽聽聽聽聽聽聽聽{
聽47聽聽聽聽聽聽聽聽聽for聽(聽Type聽i聽=聽(*bi_).lower_;聽i聽<=聽(*bi_).upper_;聽++i聽)
聽48聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(聽(*bi_).query_number(i)聽)
聽49聽聽聽聽聽聽聽聽聽聽聽聽聽*begin++聽=聽i;
聽50聽聽聽聽聽聽聽聽聽return聽begin;
聽51聽聽聽聽聽聽聽聽聽}
聽52聽};
聽53聽
聽54聽
聽55聽template<typename聽Type>
聽56聽struct聽Bitmap_Sort<Type>聽::聽_Bitmap_Impl聽
聽57聽{
聽58聽聽聽聽聽聽聽聽聽typedef聽unsigned聽long聽word_type;
聽59聽聽聽聽聽typedef聽Type聽template_type;
聽60聽
聽61聽聽聽聽聽_Bitmap_Impl(聽const聽template_type&聽lower=1,聽const聽template_type&聽upper=100聽)
聽62聽聽聽聽聽聽聽聽聽:聽lower_(lower),upper_(upper)
聽63聽聽聽聽聽{
聽64聽聽聽聽聽聽聽聽聽聽聽聽聽const聽template_type聽length聽=聽upper聽-聽lower聽+聽1;
聽65聽聽聽聽聽聽聽聽聽const聽word_type聽size聽=聽(length >> bit_shift())聽+聽1;聽
聽66聽聽聽聽聽聽聽聽聽
聽67聽聽聽聽聽聽聽聽聽buffer_聽=聽聽new聽word_type[size];
聽68聽聽聽聽聽聽聽聽聽
聽69聽聽聽聽聽聽聽聽聽memset(buffer_,size,0);
聽70聽聽聽聽聽}
聽71聽聽聽聽聽~_Bitmap_Impl()
聽72聽聽聽聽聽{聽
聽73聽聽聽聽聽聽聽聽聽delete聽[]聽buffer_;聽
聽74聽聽聽聽聽}
聽75聽
聽76聽聽聽聽聽bool聽register_number(聽const聽template_type&聽v聽)聽const
聽77聽聽聽聽聽{
聽78聽聽聽聽聽聽聽聽聽bool聽ans聽=聽false;
聽79聽聽聽聽聽聽聽聽聽if聽(聽v聽<=聽upper_聽&&聽v聽>=聽lower_聽)
聽80聽聽聽聽聽聽聽聽聽{
聽81聽聽聽聽聽聽聽聽聽聽聽聽聽const聽template_type聽shift聽=聽v聽-聽lower_;
聽82聽聽聽聽聽聽聽聽聽聽聽聽聽const聽word_type聽arr_position聽=聽shift聽>>聽bit_shift();
聽83聽聽聽聽聽聽聽聽聽聽聽聽聽const聽word_type聽relative_position聽=聽shift聽&聽(聽(1聽<<聽bit_shift())聽-聽1聽);
聽84聽聽聽聽聽聽聽聽聽聽聽聽聽const聽word_type聽patch聽=聽1聽<<聽(聽relative_position聽+聽1聽);
聽85聽聽聽聽聽聽聽聽聽聽聽聽聽buffer_[arr_position]聽|=聽patch;
聽86聽聽聽聽聽聽聽聽聽聽聽聽聽ans聽=聽true;
聽87聽聽聽聽聽聽聽聽聽}
聽88聽聽聽聽聽聽聽聽聽return聽ans;
聽89聽聽聽聽聽}
聽90聽聽聽聽聽bool聽query_number(聽const聽template_type&聽v聽)聽const
聽91聽聽聽聽聽{
聽92聽聽聽聽聽聽聽聽聽bool聽ans聽=聽false;
聽93聽聽聽聽聽聽聽聽聽//not聽necessory,聽commented
聽94聽聽聽聽聽聽聽聽聽//if聽(聽v聽<=聽upper_聽&&聽v聽>=聽lower_聽)
聽95聽聽聽聽聽聽聽聽聽//{
聽96聽聽聽聽聽聽聽聽聽const聽template_type聽shift聽=聽v聽-聽lower_;
聽97聽聽聽聽聽聽聽聽聽const聽word_type聽arr_position聽=聽shift聽>>聽bit_shift();
聽98聽聽聽聽聽聽聽聽聽const聽word_type聽relative_position聽=聽shift聽&聽(聽(1聽<<聽bit_shift())聽-聽1聽);
聽99聽聽聽聽聽聽聽聽聽const聽word_type聽patch聽=聽1聽<<聽(聽relative_position聽+聽1聽);
100聽聽聽聽聽聽聽聽聽if(聽buffer_[arr_position]聽&聽patch聽)
101聽聽聽聽聽聽聽聽聽聽聽聽聽ans聽=聽true;
102聽聽聽聽聽聽聽聽聽//}
103聽聽聽聽聽聽聽聽聽return聽ans;
104聽聽聽聽聽}
105聽
106聽聽聽聽聽const聽word_type聽bit_shift()聽const
107聽聽聽聽聽{
108聽聽聽聽聽聽聽聽聽return聽 8 == sizeof(unsiged long) ? 6 : 5;
110聽聽聽聽聽}
111聽聽聽聽聽
112聽聽聽聽聽template_type聽lower_;
113聽聽聽聽聽template_type聽upper_;
114聽聽聽聽聽mutable聽word_type*聽buffer_;
115聽};
116聽
117聽
118聽}//namespace聽feng
119聽
120聽#endif聽//_BITMAP_HPP_INCLUDED
121聽
122聽
123聽
涓涓祴璇曠敤渚嬶細
#include聽<bitmap.hpp>
#include聽<iostream>
#include聽<iterator>
using聽namespace聽std;
int聽main()
{
聽聽聽聽feng::Bitmap_Sort<unsigned聽long>聽bs(1,聽10000000);
聽聽聽聽//feng::Bitmap_Sort<unsigned聽long>聽bs(10000000,聽1);
聽聽聽聽bs.process((istream_iterator<unsigned聽long>(cin)),聽(istream_iterator<unsigned聽long>()));
聽聽聽聽bs.produce(ostream_iterator<unsigned聽long>(cout,聽"\n"));
聽聽聽聽return聽0;
}

]]>