JAVA 外部排序
来源:互联网 发布:clean my mac 编辑:程序博客网 时间:2024/06/04 17:57
import java.io.*;
public class SortLargeFile{
public static final int MAX_ARRAY_SIZE=100000;
public static final int BUFFER_SIZE=100000;
public static void main(String[] args) throws Exception{
sort("largedata.dat","sortedfile.dat");
displayFile("sortedfile");
}
public static void sort(String sourcefile,String targetfile) throws Exception{
int numberofSegments=initializeSegments(MAX_ARRAY_SIZE,sourcefile,"f1.dat");
merge(numberofSegments,MAX_ARRAY_SIZE,"f1.dat","f2.dat","f3.dat",targetfile);
}
private static int initializeSegments(int segmentSize,String originalFile,String f1)throws Exception{
int[] list=new int[segmentSize];
DataInputStream input=new DataInputStream(new BufferedInputStream(new FileInputStream(originalFile)));
DataOutputStream output=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f1)));
int numberofSegments=0;
while(input.available()>0){
numberofSegments++;
int i=0;
for(;input.available()>0&& i
list[i]=input.readInt();
}
java.util.Arrays.sort(list,0,i);
for(int j=0;j
output.writeInt(list[j]);
}
}
input.close();
output.close();
return numberofSegments;
}
private static void merge(int numberofSegments,int segmentSize,String f1,String f2,String f3,String targetfile) throws Exception{
if(numberofSegments>1){
mergeOneStep(numberofSegments,segmentSize,f1,f2,f3);
merge((numberofSegments+1)/2,segmentSize*2,f3,f1,f2,targetfile);
}
else{
File sortedFile=new File(targetfile);
if(sortedFile.exists())sortedFile.delete();
new File(f1).renameTo(sortedFile);
}
}
private static void mergeOneStep(int numberofSegments,int segmentSize,String f1,String f2,String f3)throws Exception{
DataInputStream f1Input=new DataInputStream(new BufferedInputStream(new FileInputStream(f1),BUFFER_SIZE));
DataOutputStream f2Output=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f2),BUFFER_SIZE));
copyHalfTof2(numberofSegments,segmentSize,f1Input,f2Output);
DataInputStream f2Input=new DataInputStream(new BufferedInputStream(new FileInputStream(f2),BUFFER_SIZE));
DataOutputStream f3Output=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f3),BUFFER_SIZE));
mergeSegments(numberofSegments/2,segmentSize,f1Input,f2Input,f3Output);
f1Input.close();
f2Input.close();
f3Output.close();
}
private static void copyHalfTof2(int numberofSegments,int segmentSize,DataInputStream f1,DataOutputStream f2)throws Exception{
for(int i=0;i<(numberofSegments/2)*segmentSize;i++){
f2.writeInt(f1.readInt());
}
}
private static void mergeSegments(int numberofSegments,int segmentSize,DataInputStream f1,DataInputStream f2,DataOutputStream f3)throws Exception{
for(int i=0;i
mergeTwoSegments(segmentSize,f1,f2,f3);
}
while(f1.available()>0){
f3.writeInt(f1.readInt());
}
}
private static void mergeTwoSegments(int segmentSize,DataInputStream f1,DataInputStream f2,DataOutputStream f3)throws Exception{
int intFormF1=f1.readInt();
int intFormF2=f2.readInt();
int f1Count=1;
int f2Count=1;
while(true){
if(intFormF1
f3.writeInt(intFormF1);
if(f1.available()==0 || f1Count++>=segmentSize){
f3.writeInt(intFormF2);
break;
}
else{
intFormF1=f1.readInt();
}
}
else{
f3.writeInt(intFormF2);
if(f2.available()==0 || f2Count++>=segmentSize){
f3.writeInt(intFormF1);
break;
}
else{
intFormF2=f2.readInt();
}
}
}
while(f1.available()>0&&f1Count++
f3.writeInt(f1.readInt());
}
while(f2.available()>0&&f2Count++
f3.writeInt(f2.readInt());
}
}
public static void displayFile(String filename){
try{
DataInputStream input=new DataInputStream(new FileInputStream(filename));
for(int i=0;i<100;i++)
System.out.print(input.readInt()+" ");
input.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
}