外部排序 java_外部排序(java实现)

mportjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Iterator;importjava.util.Random;/*** Purely informational so use at your own risk, it is not optimized and it can

* only handle data sets that have a size that is are divible by BUFFER_SIZE.

**/publicclassExternalSort {publicstaticintBUFFER_SIZE=10;publicFile sort(File file)throwsIOException {

ArrayListfiles=split(file);returnprocess(files);

}//recursive method to merge the lists until we are left with a//single merged listprivateFile process(ArrayListlist)throwsIOException {if(list.size()==1) {returnlist.get(0);

}

ArrayListinter=newArrayList();for(Iteratoritr=list.iterator(); itr.hasNext();) {

File one=itr.next();if(itr.hasNext()) {

File two=itr.next();

inter.add(merge(one, two));

}else{returnone;

}

}returnprocess(inter);

}/*** Splits the original file into a number of sub files.*/privateArrayListsplit(File file)throwsIOException {

ArrayListfiles=newArrayList();int[] buffer=newint[BUFFER_SIZE];

FileInputStream fr=newFileInputStream(file);booleanfileComplete=false;while(!fileComplete) {intindex=buffer.length;for(inti=0; i

buffer[i]=readInt(fr);if(buffer[i]==-1) {

fileComplete=true;

index=i;

}

}if(buffer[0]>-1) {

Arrays.sort(buffer,0, index);

File f=newFile("set"+newRandom().nextInt());

FileOutputStream writer=newFileOutputStream(f);for(intj=0; j

writeInt(buffer[j], writer);

}

writer.close();

files.add(f);

}

}

fr.close();returnfiles;

}/*** Merges two sorted files into a single file.

*

*@paramone

*@paramtwo

*@return*@throwsIOException*/privateFile merge(File one, File two)throwsIOException {

FileInputStream fis1=newFileInputStream(one);

FileInputStream fis2=newFileInputStream(two);

File output=newFile("merged"+newRandom().nextInt());

FileOutputStream os=newFileOutputStream(output);inta=readInt(fis1);intb=readInt(fis2);booleanfinished=false;while(!finished) {if(a!=-1&&b!=-1) {if(a

writeInt(a, os);

a=readInt(fis1);

}else{

writeInt(b, os);

b=readInt(fis2);

}

}else{

finished=true;

}if(a==-1&&b!=-1) {

writeInt(b, os);

b=readInt(fis2);

}elseif(b==-1&&a!=-1) {

writeInt(a, os);

a=readInt(fis1);

}

}

os.close();returnoutput;

}privatevoidwriteInt(intvalue, FileOutputStream merged)throwsIOException {

merged.write(value);

merged.write(value>>8);

merged.write(value>>16);

merged.write(value>>24);

merged.flush();

}privateintreadInt(FileInputStream fis)throwsIOException {intbuffer=fis.read();if(buffer==-1) {return-1;

}

buffer|=(fis.read()<<8);

buffer|=(fis.read()<<16);

buffer|=(fis.read()<<24);returnbuffer;

}/***@paramargs

*@throwsIOException*/publicstaticvoidmain(String[] args)throwsIOException {

File file=newFile("mainset");

Random random=newRandom(System.currentTimeMillis());

FileOutputStream fw=newFileOutputStream(file);for(inti=0; i

ger=ger<0?-ger : ger;

fw.write(ger);

fw.write(ger>>8);

fw.write(ger>>16);

fw.write(ger>>24);

}

fw.close();

ExternalSort sort=newExternalSort();

System.out.println("Original:");

dumpFile(sort, file);

File f=sort.sort(file);

System.out.println("Sorted:");

dumpFile(sort, f);

}privatestaticvoiddumpFile(ExternalSort sort, File f)throwsFileNotFoundException, IOException {

FileInputStream fis=newFileInputStream(f);inti=sort.readInt(fis);while(i!=-1) {

System.out.println(Integer.toString(i));

i=sort.readInt(fis);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值