• 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
    ",arr_size);
        pt=(int *)malloc(sizeof(int)*arr_size);
        if(!pt){fprintf(stderr," can't malloc memory 
    ");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
    ");
        }
        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
    ",pos);
      *(parr+pos)|=(1<<(pos&mask));
    }
    void clsBit(int n,int *parr)
    {
        int pos=n>>shift;
       // printf("clsBit pos : %d
    ",pos);
        *(parr+pos)&=(~(1<<(pos&mask)));
    }
    int isOne(int elem,int *parr)
    {
        int pos=elem>>shift;
        int flag= *(parr+pos)&(1<<(pos&mask));
        //printf("	isOne:%d
    ",flag);
        return flag;
    }
    void  test()
    {
        int *parr=bitVect(6);
        int arr[6]={1,5,4,3,2,6};
        printf("reginal data :
    ");
        int i=1;
        for(;i<=6;i++)
        {
            clsBit(i,parr);
            if(i==6)
            {
                printf("%d
    ",arr[i-1]);
            }
            else
            {
                printf("%d,",arr[i-1]);
            }
        }
        printf("
    ");
        i=0;
        for(;i<=6;i++)
        {
            setBit(arr[i-1],parr);
        }
        i=1;
        printf("sort data :
    ");
        for(;i<=6;i++)
        {
            if(isOne(i,parr))
            {
                if(i==6)
                {
                    printf(" %d
    ",i);
                }
                else
                {
                    printf(" %d,",i);
                }
            }
        }
        printf(" bitFree(%p) :%d
    ",parr,bitFree(parr));
    }
    int main(void)
    {
        test();
        return 0;
    }
  • 相关阅读:
    判断回文字符串
    汉诺塔递归问提
    课程作业02.2
    编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
    《大道至简》第一章java伪代码分析
    《大道至简》读后感
    用户体验
    大二上学期软件工程概论学习进度表(第十五周)
    12-24个人博客
    大二上学期软件工程概论学习进度表(第十四周)
  • 原文地址:https://www.cnblogs.com/innobase/p/4574967.html
Copyright © 2020-2023  润新知