C 实现位图排序

应用场景:

1到N的不重复乱序数据,乱序数据总最大不超过N,需要高效的排序。

sorr.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define mask 0x1F
#define shift 5
/**************************
 * function name: bitVect
 * description :according size to malloc memory
 * params :
 *    size --input array size,every element in array can‘t over size
 * return : return a fixed memory
 *************************/
int *bitVect(int size)
{
    int arr_size=0;
    int *pt=NULL;
    if((size%(1<<shift))==0)
    {
        arr_size=size/(1<<shift);
    }
    else
    {
        arr_size=(size/(1<<shift))+1;
    }
    printf(" malloc sizeof(int) count :%d\n",arr_size);
    pt=(int *)malloc(sizeof(int)*arr_size);
    if(!pt){fprintf(stderr," can‘t malloc memory \n");return NULL;}
    memset(pt,0,arr_size);
    return  pt;
}
/*************************
 * function name: bitFree
 * description :free a memory named target
 * params :
 *    target --a pointer that is needed to free
 * return : if opertation is ok,that return 1
 * ***********************/
int bitFree(void *target)
{
    if(target!=NULL)
    {
      free(target);
      target=NULL;
      printf(" target free ok\n");
    }
    else
    {
        return 1;
    }
    return 0;
}
/***********************
 * function name:setBit
 * description :set bit value in one element from array
 * params :
 *
 *
 *********************/
void setBit(int elem,int *parr)
{
  int pos=elem>>shift;
  //printf(" pos = %d\n",pos);
  *(parr+pos)|=(1<<(pos&mask));
}
void clsBit(int n,int *parr)
{
    int pos=n>>shift;
   // printf("clsBit pos : %d\n",pos);
    *(parr+pos)&=(~(1<<(pos&mask)));
}
int isOne(int elem,int *parr)
{
    int pos=elem>>shift;
    int flag= *(parr+pos)&(1<<(pos&mask));
    //printf("\tisOne:%d\n",flag);
    return flag;
}
void  test()
{
    int *parr=bitVect(6);
    int arr[6]={1,5,4,3,2,6};
    printf("reginal data :\n");
    int i=1;
    for(;i<=6;i++)
    {
        clsBit(i,parr);
        if(i==6)
        {
            printf("%d\n",arr[i-1]);
        }
        else
        {
            printf("%d,",arr[i-1]);
        }
    }
    printf("\n");
    i=0;
    for(;i<=6;i++)
    {
        setBit(arr[i-1],parr);
    }
    i=1;
    printf("sort data :\n");
    for(;i<=6;i++)
    {
        if(isOne(i,parr))
        {
            if(i==6)
            {
                printf(" %d\n",i);
            }
            else
            {
                printf(" %d,",i);
            }
        }
    }
    printf(" bitFree(%p) :%d\n",parr,bitFree(parr));
}
int main(void)
{
    test();
    return 0;
}
时间: 2024-08-24 16:07:03

C 实现位图排序的相关文章

位图排序

在<编程珠玑>上看到的,开篇第一个问题,有很多数,小于一个MAXNUM,没有重复的,怎么排序最快. 答案是位图排序. 如果某一位不为0,那么这一位存代表一个数,位数(在序列中的位置)代表这个数. 比方说这些数都存在数组a,然后利用一个数组b,b初始状态各位都为0,然后读取a,如果a[1]=2,那么b[2]为1,a[3]=6,那么b[6]=1. 实现如下: 1 #include <iostream> 2 #include <fstream> 3 #include<s

[数据结构]利用位图排序

[cpp] view plaincopy #include <stdio.h> #include <stdlib.h> #define INT_BY_BIT 32 #define MASK 0x1F #define SHIFT 5 #define N 1000000 int a[N/INT_BY_BIT+1]; void set_bit(int x) {a[x>>SHIFT] |= 1 << (x & MASK);} void clear_bit(i

【每日算法】计数&amp;基数&amp;桶&amp;位图排序-简介

在前面的文章中,我们介绍的都是基于比较的排序. 对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的). 本文将继续介绍以线性时间运行的排序算法,他们使用的是非比较排序,因此下界O(n logn)对它们不适用. 计数排序 想象下面这种情况: 一个班有k个人,需要排成一条纵队,地面上已经用粉笔按从小到大的顺序标明了1到k个号码,要求按身高从低到高排列,也就是说,最高的站在标号为k的位置,最矮的站在标号为1的位置. 那么对于每个人,如何知

计数排序与位图排序

计数排序(Counting sort)是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置.计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.计数排序更适合于小范围集合的排序.比如100万学生参加高考,我们想对这100万学生的数学成绩(

位图排序(位图技术应用)

1.  问题描述 给定不大于整数 n 的 k 个互不相等的整数 ( k <n ) , 对这些整数进行排序.本文讨论的内容具体可参见<编程珠玑>(第二版)的第一章. 2.  问题分析 关于排序,已经有多种排序方法了:插入排序,归并排序,快速排序,希尔排序等.每种排序都有不同的用武之地.为什么需要位图排序呢?所有的内部排序(上述所提及)都必须一次性将所有排序元素载入内存.假如有1000,000个整数,每个整数4字节,则意味着,至少需要4000,000B 约为 4MB 的内存空间, 如果仅仅只

【算法思想】位图排序算法

问题的提出 一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.假设最多只有1M的内存空间可用,在考虑空间和时间的优化的情况下,请问如何对其进行排序? 常规思想 我们假设这些整数都是用整型存储(一般整型的大小为4个字节),那么1M字节可以存储250 000个数据.由于输入文件最大可能有10^7个数据,因此可以通过遍历输入文件40次来完成排序.第一次将在[0,249 999]范围内的整数读入到内存中,第二次将在[250 000,499 999]范围内的整数读入到内存中,依此类推.每读入

Go语言实现位图排序

Go语言提供了byte类型,一个byte对应8个位,所以转换一下就可以实现位图了. 代码: package main //author:xcl //date:2014-1-25 import ( "fmt" ) func main() { arrInt32 := [...]uint32{5, 4, 2, 1, 3, 17, 13} var arrMax uint32 = 20 bit := NewBitmap(arrMax) for _, v := range arrInt32 { b

位图排序思想及代码详解

输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.如果在输入文件中有任何重复整数出现就是致命错误.没有其他数据与该整数相关联 输出:按升序排列的 输入整数的列表. 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用.运行时间最多几分钟,运行时间为10秒就不需要进一步优化了.          从0开始解决这个问题的话,可以把它分为两个部分:首先随机生成K个小于N的数:再对这K个数排列.          系统参数:GCC:#pragma pack(4)    

PHP实现 bitmap 位图排序 求交集

2014年12月16日 17:15:09 初始化一串全为0的二进制; 现有一串无序的整数数组; 如果整数x在这个整数数组当中,就将二进制串的第x位置为1; 然后顺序读取这个二进制串,并将为1的位转换成整数,顺序存放到新的集合中,就是排好序的了 排序代码: 1 function sort() 2 { 3 // var_dump(PHP_INT_MAX, PHP_INT_SIZE); 4 // int 9223372036854775807 5 // int 8 6 $bitmap = array_