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();
 }
  }
}

0 0
原创粉丝点击