位图排序法,时空高效的至高境界

本文深入探讨位图排序法的核心原理及其在处理特定数据集时的高效表现,通过实验证明其在时间和空间上的优势,对比通用排序算法的性能,突出其简洁性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//位图排序法,时空高效的至高境界
/*
位图排序法有两个限制条件:
 1、待排序数据都在一个已知的相对较小的范围内; 也不小?
 2、所有数据没有重复;  
*/
#include <stdio.h>

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];

void set(int i){
    a[i >> SHIFT] |= (1<<(i & MASK));
}

void clr(int i){
    a[i >> SHIFT] &= ~(1<<(i & MASK));
}

int test(int i){
    return a[i >> SHIFT] & (1<<(i & MASK));
}

int main(void) 
{
    int i, j;
    for (i = 0; i < N; i++) {
        clr(i);
    }
    //while (scanf("%d", &i) != EOF) {
    //    set(i);
    //}
    
    for (j = 0; j < 3; j++) {    //供简单的正确性测试
        scanf("%d", &i);            //注意,输入的数不能重复
        set(i);                        //否则当只输入一次
    }
    for (i = 0; i < N; i++) {
        if (test(i))
            printf("%d\n", i);
    }
    return 0;
}

http://www.cnblogs.com/Flouse/archive/2007/12/12/bitSort.html

为什么说这个算法时空效率达到及致呢?我们对100万个不重复的正整数(1000,0000以内)的文件进行测试:

    系统排序     C++/STL.set     C/qsort     C/位图
总时间(s)     89     38     12.6     10.7
计算时间(s)     79     28     2.4     0.5
内存使用(MB)     0.8     70     4     1.25
(本测试数据是在较旧的电脑上测试的,但还是体现性能的差距)
  第一行是总时间,第二行的计算时间是总时间减去数据读取耗时10.2秒。虽然通用C++程序使用内存和CPU时间是专用C程序(C/位图)的50倍,但是它的使用仅需要一半的代码,并能很容易扩展到其他问题上,这也是专用C程序最大的缺点吧。
  下文回复还有网友提供的Bitmap排序的C#版,我还没有进行性能测试,估计性能也是很好的,而且那样的程序扩展性显然强很多,但是就失去了空间优势了。

凡事力求尽可能简洁,但不能简略。

转载于:https://www.cnblogs.com/mull/archive/2013/04/12/4477830.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值