/××××××××××××××××××××××××××MonkeyAndy原创,转载请注明出处×××××××××××××××××××××××/
http://blog.csdn.net/MonkeyAndy
/××××××××××××××××××××××××××MonkeyAndy原创,转载请注明出处×××××××××××××××××××××××/
没有最好只有更好,如您有更好的解决方案,欢迎批评指正,共同学习进步
问题描述:
当有大量不重复的数据需要排序时,如n(n在 10^k , 32>k>7 )时,采用常用的算法,一般需要开辟的辅助存储空间比较大,本文介绍采用STL中的bitset实现排序。
首先介绍下bitset
bitset为C++ STL中的一个库函数,使用时需要包含 #include <bitset>,本文仅介绍其在本文中用到的功能函数。
构造函数
bitset<n> b;
b有n位,每位都为0.参数n可以为一个表达式.
如bitset<5> b0;则"b0"为"00000";
set(pos)
把在pos处的二进制位置为1
reset()
把所有二进制位都置为0
有了以上函数便可以实现基本的排序了(注:对于有重复数据和负数数据的本方法不适用)。
思路:
1、创建一个有MAX个数据的bitset对象bit_map,将其所有位使用reset()置为0.
2、遍历所有数据,使用set()函数将数值对应的位置为1.
3、遍历bit_map中的所有位,若其值为1,则输出,亦即排序后的结果
demo
#include <iostream> #include <bitset> #include <ctime> #include <cstdlib> #include <iomanip> using namespace std; #define MAX 100 int main() { bitset<MAX> bit_map; bit_map.reset(); int count=0; srand(time(NULL)); for(int i=0; i<MAX; i++) { int rd = rand() % 100; bit_map.set(rd); } for(int j=0; j<MAX; j++) { if(bit_map[j] == 1) { cout<< setw(12) << j << " "; if((count+1) % 10 == 0) cout << "\n"; count++; } } cout << "\nTOTAL: " << count << endl; return 0; }
bitset适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是 int 的 10 倍以下
基本原理及要点:使用 bit 数组来表示某些元素是否存在
更多相关内容请见