大量数据的排序问题,新手请教

假的旁边就是真的 2013-04-12 09:25:02
要对10亿个整数进行排序,整数是正整数、有可能是重复的。因为数据太多不可能一次性从文件中读入数据到内存进行排序,目前我只想到把数据写到数据库进行排序,没有想到其他的排序方法,请教各位有没有办法,我现在觉得无从下手。
...全文
456 17 打赏 收藏 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
airways1 2013-04-13
  • 打赏
  • 举报
回复
quicksort 算法最简单
  • 打赏
  • 举报
回复
问题我已经发现了,是因为代码写重复了

 while((i=dbuf.readInt())!=-1){    
             i=dbuf.readInt(); 
这里进行了两次读入。
yyw6637 2013-04-12
  • 打赏
  • 举报
回复
写入数据库,查询排序select * from A order by num
  • 打赏
  • 举报
回复
引用 1 楼 xiesisi3 的回复:
http://www.cnblogs.com/lqminn/archive/2012/08/30/2663281.html
这种方法只能对没有重复的整数进行排序啊。。。。
xiesisi3 2013-04-12
  • 打赏
  • 举报
回复
http://www.cnblogs.com/lqminn/archive/2012/08/30/2663281.html
qqhw123 2013-04-12
  • 打赏
  • 举报
回复
你看看读取到什么位置出错的,是不是文件里面的内容有小问题。
xiesisi3 2013-04-12
  • 打赏
  • 举报
回复
引用 11 楼 heyufengcc1 的回复:
引用 9 楼 xiesisi3 的回复:有异常请先百度。自己很快就能找到答案的东西不用在这里等回复。 嗯 但是有些百度不到,而且有些答案百度上解释的不明白。
就基本的知识来说,没有百度不到或者google不到的问题,只是你找问题的方式可能有问题。 把你的异常贴出来看看吧。
kosora曹 2013-04-12
  • 打赏
  • 举报
回复
引用 3 楼 yyw6637 的回复:
写入数据库,查询排序select * from A order by num
楼主肯定试过你这种方法。
  • 打赏
  • 举报
回复
引用 10 楼 AFer198215 的回复:
笨猫参考#1的方法,如果lz能给jvm分配3G内存的,那么: byte[] bys = new byte[Integer.MAX_VALUE]; 初始时,每个byte的值是0,有一个值就加一个,如: 10031 10132 10031 10031 就是 bys[10031]=3 bys[10132]=1 每个值重复次数每个不能超过Byte.……
我自己写了一段代码应该是可以实现的 但是出现了上面说的异常,异常是因为读文件时产生的

byte[] arrRead=new byte[1000000];
	int y;
	public void readFlie() {
		try{
		FileInputStream fr=new FileInputStream("D:/data.txt");
		BufferedInputStream bufr=new BufferedInputStream(fr);
		DataInputStream dbuf=new DataInputStream(bufr);
		int i=0;
		//把arrRead的每一个值初始化为0
		for(int q=0;q<arrRead.length;q++)
			arrRead[q]=0;
		//从文件中读取数据出现一次对应的值+1
		while((i=dbuf.readInt())!=-1){
				i=dbuf.readInt();
				if(arrRead[i]==0){
					arrRead[i]=1;
					}else{
						y= arrRead[i]++;}
			}
			dbuf.close();
		} catch (IOException e) {
				e.printStackTrace();
			}	
		//输出数组对应到底下标,实现排序
		for(int j=0;j<arrRead.length;j++)
			if(arrRead[j]==1){				
				System.out.println(j);
			}else{
				for(int z=0;z<y;z++)
				System.out.println(j);
			}
  • 打赏
  • 举报
回复
引用 9 楼 xiesisi3 的回复:
有异常请先百度。自己很快就能找到答案的东西不用在这里等回复。
嗯 但是有些百度不到,而且有些答案百度上解释的不明白。
想喝咖啡的貓 2013-04-12
  • 打赏
  • 举报
回复
笨猫参考#1的方法,如果lz能给jvm分配3G内存的,那么: byte[] bys = new byte[Integer.MAX_VALUE]; 初始时,每个byte的值是0,有一个值就加一个,如: 10031 10132 10031 10031 就是 bys[10031]=3 bys[10132]=1 每个值重复次数每个不能超过Byte.MAX_VALUE。
xiesisi3 2013-04-12
  • 打赏
  • 举报
回复
有异常请先百度。自己很快就能找到答案的东西不用在这里等回复。
  • 打赏
  • 举报
回复
在读文件的时候发现一个问题, java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:375) at t1.SortFile.readFlie(SortFile.java:22) at t1.SortFile.main(SortFile.java:43),导致数据丢失 下面是代码

                FileInputStream fr=new FileInputStream("D:/data.txt");
		BufferedInputStream bufr=new BufferedInputStream(fr);
		DataInputStream dbuf=new DataInputStream(bufr);
		int i=0;
		while((i=dbuf.readInt())!=-1){
				i=dbuf.readInt();
				System.out.println(i);
我不知道这是何种原因导致,读取的时候发生异常,求各位解答
  • 打赏
  • 举报
回复
引用 6 楼 qqhw123 的回复:
不过数据量还是有些大,10亿个数插入查询都是很慢的。
嗯 的确,这个位向量排序很好用
qqhw123 2013-04-12
  • 打赏
  • 举报
回复
不过数据量还是有些大,10亿个数插入查询都是很慢的。
qqhw123 2013-04-12
  • 打赏
  • 举报
回复
引用 4 楼 heyufengcc1 的回复:
引用 1 楼 xiesisi3 的回复: http://www.cnblogs.com/lqminn/archive/2012/08/30/2663281.html 可以用
好办法,可以利用数据库来将数据排序,然后按顺序导出。
  • 打赏
  • 举报
回复
引用 1 楼 xiesisi3 的回复:
http://www.cnblogs.com/lqminn/archive/2012/08/30/2663281.html
可以用

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧