http://baike.baidu.com/link?url=4OAMuQ6CYG6IjdyYH6y5zeDfd8GCVvlb5G6NXTSJSOQOVHMSC7qBOZ1STmKVM7UUldxfj6edBitJ9e66mG5mWK
http://blog.csdn.net/cscmaker/article/details/8074268
1)位图法
所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的(百度百科)。
例如:对{0, 1, 5,3, 7}进行排序,可以在计算机中使用8位表示这几个数,也就是使用一个字节空间可以完成排序。
数组中的数: 0 1 3 5 7
bitmap中的位值: 1 1 0 1 0 1 0 1 //若在数组中,则位值设为1,否则为0
bitmap中的位标号: 0 1 2 3 4 5 6 7
位图法还可以判断数组中值是否重复出现。位图法在降低了时间复杂度的同时,很好的控制了空间复杂度。
(2)算法实现(分为 针对无符号数组 及 有符号数组)
A:针对无符号数组实现:
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- using namespace std;
- void set_bit(char *bit_map, int n)
- {
- for(int i=0; i<(n/8); ++i)
- bit_map++;
- //相应表示的位置1
- *bit_map =(*bit_map) | (0x01<<n%8);
- }
- int get_max_value(int num[], int n)
- {
- int temp = num[0];
- for(int i=1; i<n; ++i)
- {
- if(num[i]>temp)
- temp = num[i];
- }
- return temp;
- }
- void bit_map_sort(int num[], int n)
- {
- //首先得到数组中的最大值
- int max = get_max_value(num, n);
- //计算bitmap的长度,每一个字节可以表示8个数
- int bit_map_len = 0;
- if(max%8 == 0)
- bit_map_len = max/8;
- else
- bit_map_len = max/8+1;
- //创建bitmap
- char* bit_map = new char[bit_map_len];
- memset(bit_map, 0, bit_map_len);
- for(int i=0; i<n; ++i)
- set_bit(bit_map, num[i]);
- //输出数组
- for(int i=0; i<bit_map_len; ++i)
- {
- for(int j=0; j<8; ++j)
- {
- //如果该位是1,则输出
- if((bit_map[i]&(0x01<<j)) == (0x01<<j))
- cout<<(i*8+j)<<" ";
- }
- }
- cout<<endl;
- }
- int main()
- {
- int num[] = {3,5, 2, 10, 6, 9999999, 8, 14, 9};
- bit_map_sort(num, 9);
- return 0;
- }
B:针对有符号数组(数组中存在负数)
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- using namespace std;
- //从bitmap中间开始计算,左边表示负数,右边表示正数
- void set_bit(char *bit_map_mid, int num)
- {
- //若为正数,则指针右移
- if(num >= 0)
- for(int i=0; i<(num/8); ++i)
- bit_map_mid++;
- //反之,指针左移
- if(num < 0)
- {
- num = -1*num;
- for(int i=0; i<(num/8); ++i)
- bit_map_mid--;
- bit_map_mid--;
- }
- //相应表示的位置1
- *bit_map_mid =(*bit_map_mid) | (0x01<<num%8);
- }
- //得到数组中绝对值最大的值
- int get_max_absolute_value(int num[], int n)
- {
- int temp = 0;
- for(int i=0; i<n; ++i)
- {
- if(num[i]>temp)
- temp = num[i];
- else if(num[i]<0)
- if((num[i]*(-1))>temp)
- temp = num[i]*(-1);
- }
- return temp;
- }
- void bit_map_sort(int num[], int n)
- {
- //首先得到数组中的最大值
- int max = get_max_absolute_value(num, n);
- //计算bitmap的长度,每一个字节可以表示8个数
- int bit_map_len = 0;
- if(2*max%8 == 0)//若最大值为16,则其bitmap应该能表示[-16, 16],所以乘以2;
- bit_map_len = 2*max/8;
- else
- bit_map_len = 2*max/8+1;
- //创建bitmap
- char* bit_map = new char[bit_map_len];
- memset(bit_map, 0, bit_map_len);
- int mid = bit_map_len/2;
- for(int i=0; i<n; ++i)
- set_bit(bit_map+mid, num[i]);
- //首先输出负数
- for(int i=0; i<mid; ++i)
- {
- for(int j=0; j<8; ++j)
- {
- //如果该位是1,则输出
- if((bit_map[i]&(0x01<<j)) == (0x01<<j))
- cout<<(-1)*((mid-1-i)*8+j)<<" ";
- }
- }
- for(int i=mid; i<bit_map_len; ++i)
- {
- for(int j=0; j<8; ++j)
- {
- //如果该位是1,则输出
- if((bit_map[i]&(0x01<<j)) == (0x01<<j))
- cout<<(i-mid)*8+j<<" ";
- }
- }
- cout<<endl;
- }
- int main()
- {
- int num[] = {3,5, 2, 10, 6, -999999, 8, -14, 9};
- bit_map_sort(num, 9);
- return 0;
- }