java 位向量_基于位图、位向量的快速排序 | 学步园

需求:

1.需要就N位数字进行排序(N>5)

2.N位数是一个稠密的数字集合

3.集合中没有重复的元素(数字)

限制:

1.尽量减少内存使用

2.要求

先写一个工具类,生成稠密集合

import java.util.Date;

import java.util.HashSet;

import java.util.Random;

import java.util.Set;

public class InitArray

{

public static Integer[] getArray(int nums)

{

int count=0;

Random random = new Random(new Date().getTime());

Set set = new HashSet();

for(;count

{

set.add((int)(random.nextFloat()*nums));

}

return set.toArray(new Integer[]{});

}

}

排序实现

import java.util.Date;

public class BitMapSort

{

//N 数字数量级

public static int NUMS=1000;

/**

* Logger for this class

*/

private static final Log logger = LogFactory.getLog(BitMapSort.class);

@SuppressWarnings("deprecation")

public static Integer[] sort(Integer array[])

{

byte[] loop =new byte[NUMS];

//置0 java默认为0

//for(int i=0;i

//{

//loop[i]=0;

//}

logger.info("--------------开始位向量排序--------------");

Date begin = new Date();

//将数据插入位图

for(int j=0;j

{

loop[array[j]]=1;

}

//输出排序

for(int j=0,k=0;k

{

if(loop[k]==1)

{

array[j++]=k;

}

}

Date end = new Date();

logger.info("--------------位向量排序结束--------------");

logger.info("--------------位向量排序耗时:"+(end.getMinutes()-begin.getMinutes())+"分钟 "+(end.getSeconds()-begin.getSeconds())+"秒--------------");

return array;

}

}

测试:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class Main

{

/**

* Logger for this class

*/

private static final Log logger = LogFactory.getLog(Main.class);

private static int NUMS=BitMapSort.NUMS;

/**

* main。

*

详细说明:

*

* 无。

* @param args

*/

public static void main(String[] args)

{

logger.info("--------------生存"+NUMS+"以内的稠密数组--------------");

Integer array[] = InitArray.getArray(NUMS);

logger.info("--------------生成完毕--------------");

Integer arr1[] = BitMapSort.sort(array);

}

}

说明:这个排序的速度很快,但是适合稠密的数据集合,不然会浪费很多内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值