用bitmap的方法实现排序,时间复杂度为O(n),C实现
2012-11-14 16:42
489 查看
/* *copyright @nciaebupt 转载请保留此标记 *用bitmap的方式来对数组进行排序,时间复杂度为O(n) *这种方式的排序是用空间来换取时间的方法 *bitmap的排序方式属于非比较排序,比较排序的时间复杂度底线是O(nlogn), *而非比较排序的时间复杂度可以达到O(n),只是需要牺牲空间 */ #include <stdio.h> #include <memory.h> #define BYTESIZE 8//一个字节为8bit //这里使用char数组来实现bitmap,num数组中最大的数为14,故只需要2个char字符(2*8 = 16) #define CHARARRAYSIZE 2 #define SHIFT 3//移动三位,左移三位相当于乘以8,右移3位相当于除以8取整 int bitSet(char *p,int num)//将逻辑位置为n的二进制位置为1 { //num>>SHIFT右移3位相当于除以8求算字节位置,num%CHARSIZE对8取余即求位位置 p[num >> SHIFT] = p[num >> SHIFT] | (0x01 << (num % BYTESIZE)); return 1; } int bitreset(char * p,int num)//将逻辑位置为n的二进制位置为0 { //num>>SHIFT右移3位相当于除以8求算字节位置,num%CHARSIZE对8取余即求位位置 p[num >> SHIFT] = p[num >> SHIFT] & (~(0x01 << (num % BYTESIZE))); } int test(char * p,int num))//测试逻辑位置为n的二进制位是否为1 { return p[num >> SHIFT] & (0x01 << (num % BYTESIZE)); } int bitMapSort() { //创建要排序的数组,只考虑正数的情况。 int num[] = {3,5,2,10,6,12,8,14,9}; //开辟CHARARRAYSIZE大小的char数组 char *chararray = new char[CHARARRAYSIZE]; //将char数组chararray的每一位都置为0 memset(chararray,0,CHARARRAYSIZE); //顺序遍历num数组,将chararray中相应下标的bit位置为1 for(int i = 0;i < sizeof(num)/sizeof(int);++i) { bitSet(chararray,num[i]); } //遍历每个bit,输出排序结果 char *ptmp = chararray; for(int i = 0;i < CHARARRAYSIZE; ++i) { for(int j = 0;j < BYTESIZE; ++j) { //int bit_value = (*ptmp) & (0x01 << j); //int bit_verify = 0x01 << j; //if(bit_value == bit_verify) if(test(chararray,j)) { printf("%d\n",i*BYTESIZE + j); } } ptmp++; } } int main(int args,char **argv) { bitMapSort(); return 0; }
相关文章推荐
- 一种时间复杂度为O(n)的排序方法(转载)
- 排列搜索 庞果网(C语言版,虽实现了,但未通过测试,时间超过3s,使用的是全排序方法,愿大神指导)
- 基数排序 原始java实现 时间复杂度O(n)
- 快速排序和冒泡排序的时间复杂度分析(C++算法实现对比)
- 七种排序方法(稳定性、空间复杂度、时间复杂度)分析总结
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- python按时间排序目录下的文件实现方法
- 快速排序的C语言实现及其时间复杂度
- PHP实现bitmap位图排序与求交集的方法
- 海量数据去重排序--bitmap(位图法)在java中的实现的两种方法
- js实现图片放大缩小功能后进行复杂排序的方法
- 快速排序的实现与时间复杂度
- js实现图片放大缩小功能后进行复杂排序的方法
- C++实现几种常用的时间复杂度为O(nlogn)的排序方法:归并排序、快速排序、堆排序、希尔排序
- 3种顺序排序方法。简单排序是指时间复杂度为O(n^2)的排序方法。
- 插入排序 和 归并排序(分治)的c实现和时间复杂度分析
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- 各种常用排序的时间复杂度和稳定性以及代码实现
- 《面试》 几种经典的简单的排序方法(冒泡,选择,插入)python实现
- 织梦DedeCms列表{dede:list}标签实现按文章权重weight排序方法