这正是起源
QuickSort
当时内存中没有足够的RAM来排序,所以它们的过程是将部分结果存储在磁盘中。
所以你可以做的是:
选择一个轴。
按顺序读取文件,并将低于透视的数据存储在temp_file_1中,将大于或等于透视的数据存储在temp_file_2中。
重复temp_file_1中的过程,并将结果附加到result_文件中。
对temp_file_2重复该过程,并将结果附加到result_文件
当零件足够小时(
就像2个直接交换
足以在内存中进行排序)
这样,您就可以成批地进行排序,并将部分结果存储在临时文件中,最后一个文件将对结果进行排序。
编辑
我告诉过你一个快速排序是可能的。
毕竟,您需要一些额外的空间来存放临时文件。
我就是这么做的。
我创建了一个40MB的文件,文件中的数字用逗号分隔。
我给它命名
input
:
输入为40MB
排序过程中,将创建具有“大于”、“小于”值存储桶的tmp文件,排序完成后,这些值将被发送到一个名为(猜测是什么)的文件中。
output
使用部分结果创建临时文件
最后,删除所有tmp文件,结果保存在“输出”文件中,并按正确的编号顺序排序:
最后创建文件“output”,注意它也是40MB
这是完整的程序。
import java.io.*;
import java.util.*;
public class FileQuickSort {
static final int MAX_SIZE = 1024*1024*16; // 16 megabytes in this sample, the more memory your program has, less disk writing will be used.
public static void main( String [] args ) throws IOException {
fileQuickSort( new File("input"), new File("output"));
System.out.println();
}
//
static void fileQuickSort( File inputFile, File outputFile ) throws IOException {
Scanner scanner = new Scanner( new BufferedInputStream( new FileInputStream( inputFile ), MAX_SIZE));
scanner.useDelimiter(",");
if( inputFile.length() > MAX_SIZE && scanner.hasNextInt()) {
System.out.print("-");
// put them in two buckets...
File lowerFile = File.createTempFile("quicksort-","-lower.tmp",new File("."));
File greaterFile = File.createTempFile("quicksort-","-greater.tmp", new File("."));
PrintStream lower = createPrintStream(lowerFile);
PrintStream greater = createPrintStream(greaterFile);
PrintStream target = null;
int pivot = scanner.nextInt();
// Read the file and put the values greater than in a file
// and the values lower than in other
while( scanner.hasNextInt() ){
int current = scanner.nextInt();
if( current < pivot ){
target = lower;
} else {
target = greater;
}
target.printf("%d,",current);
}
// avoid dropping the pivot
greater.printf("%d,",pivot);
// close the stream before reading them again
scanner.close();
lower.close();
greater.close();
// sort each part
fileQuickSort( lowerFile , outputFile );
lowerFile.delete();
fileQuickSort( greaterFile , outputFile);
greaterFile.delete();
// And you're done.
} else {
// Else , if you have enough RAM to process it
//
System.out.print(".");
List smallFileIntegers = new ArrayList();
// Read it
while( scanner.hasNextInt() ){
smallFileIntegers.add( scanner.nextInt() );
}
scanner.close();
// Sort them in memory
Collections.sort( smallFileIntegers );
PrintStream out = createPrintStream( outputFile);
for( int i : smallFileIntegers ) {
out.printf("%d,",i);
}
out.close();
// And your're done
}
}
private static PrintStream createPrintStream( File file ) throws IOException {
boolean append = true;
return new PrintStream( new BufferedOutputStream( new FileOutputStream( file, append )));
}
}
文件的格式为
number,number,number,number
您当前的格式是:
n u m b e r , n u m b , b e r
要解决这个问题,你只需要把所有的内容都读一遍,然后跳过空白。
再加一个问题。