基于位图、位向量的快速排序

14 篇文章 0 订阅

需求:

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<Integer> set = new HashSet<Integer>();
		for(;count<nums;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<NUMS;i++)
//		{
//			loop[i]=0;
//		}
		logger.info("--------------开始位向量排序--------------");
		Date begin = new Date();
		//将数据插入位图
		for(int j=0;j<array.length;j++)
		{
			loop[array[j]]=1;
		}
		//输出排序
		for(int j=0,k=0;k<NUMS;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;
	/**
	 * <b>main。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param args
	 */
	public static void main(String[] args)
	{
		logger.info("--------------生存"+NUMS+"以内的稠密数组--------------");
		Integer array[] = InitArray.getArray(NUMS);
		logger.info("--------------生成完毕--------------");
		Integer arr1[] = BitMapSort.sort(array);
	}
}
 

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值