关注分享主机优惠活动
国内外VPS云服务器

Java中如何实现外部排序(堪比Java排序)

外部排序是一种对大量数据进行排序的方法。 如果数据量超过内存容量,可以使用外部排序。 外部排序的基本思想是将数据分割成更小的块,对每个更小的块进行排序,然后将更小的块合并成一个更大的有序文件。 下面是一个简单的外部排序算法的实现。

  1. 首先,将大量数据划分为多个较小的块。 每个小块的大小必须是: 与内存容量相同。
  2. 在内部对每个块进行排序(例如使用快速排序、合并排序等)。
  3. 将小排序块写入磁盘上的临时文件。
  4. 利用归并排序的思想,将所有排序好的小块合并成一个有序的大文件。

这是一个简单的 Java 实现:

导入 java.io.*;
导入 java.util.Arrays;

public class 外部排序 {
 公共 静态 void  主要(String[] args) 抛出 IOException {
 // 假设你有一个文件input.txt,其中包含大量整数。  
 文件 输入文件 = 新建 文件("input.txt");
 //输出文件名
 文件 输出文件  = 新建 文件("output.txt") ;

 // 外部排序
 externalSort(inputFile, OutputFile);
 }

 public 静态 void 外部排序(File inputFile, File OutputFile) 抛出 IOException {
 //1.读取输入分割将文件分成多个较小的块。 
 List chunkFiles = splitInputFile(inputFile);

  // 2. 对每个块进行内部排序并将排序后的块写入磁盘上的临时文件
 ListsortChunkFiles = sortChunks(chunkFiles);
 
 // 3. 使用合并排序思想将所有已排序的小块合并为一个大的有序文件。
 mergeSortedChunks(sortedChunkFile)s,outputFile);
 }

 私有 静态 列表 splitInputFile(文件输入文件) 抛出 IOException { 
 List chunkFiles =  ArrayList();
 尝试一下 (BufferedReader 阅读器 = 新建 BufferedReader( FileReader(inputFile))) {
 List row = new ArrayList();
 字符串行;
 while ((line = Reader.readLine()) != null) {
 Lines.add(line);
 if (lines.size() == 1000 ) { //每个小块大小为1000行
 chunkFiles.add(sortAndSaveChunk(lines));
 Lines.clear();
 ] }
 }
 if (!lines.isEmpty()) {
 chunkFiles.add(sortAndSaveChunk) (lines));
 } 
 }
 返回 chunkFiles;
 }

 私有 static 文件sortAndSaveChunk(列表行) 抛出 IOException {
 Collections.sort(lines);
 文件 chunkFile  = File.createTempFile("块", ".txt");
 chunkFile.deleteOnExit(); //确保程序退出时删除临时文件
 尝试一下 (BufferedWriter 作家 =  BufferedWriter( FileWriter(chunkFile))) {
 for (字符串行:名称) {
writer.write(line);
 Writer.newLine();
 }
 } 
 返回 chunkFile;
 }

 私有 静态列表 sortChunks(列表 chunkFiles) 抛出 IOException {
 PriorityQueue 队列 =  PriorityQueue((a, b) -> 整数。比较(a.size(), b.size()));
 for (文件 chunkFile :  chunkFiles) {
 文件缓冲区 缓冲区 = 新建 文件缓冲区(chunkFile);
  if (buffer.size() > 0) {
 queue.add(buffer);
 }
 }

 ListsortedChunkFiles =  ArrayList();
 while (!queue.isEmpty()) {
 文件缓冲区 缓冲区 =  queue.poll();
sortedChunkFiles.add (buffer.file);
 if (buffer.size() > 0) {
 FileBuffer nextBuffer  =  文件缓冲区(buffer.file );
 nextBuffer.readNextLine();
 queue.add(nextBuffer );
 }
 }

 返回sortedChunkFiles;
 }

 私有 静态 void mergeSortedChunks(ListsortedChunkFiles,文件输出文件) 抛出 IOException {
 PriorityQueue 队列 =  PriorityQueue((a, b) -> Integer.compare(a.size(), b.size()));
 for (文件 chunkFile :sortedChunkFiles) {
 文件缓冲区 缓冲区 =  FileBuffer(chunkFile);
  if (buffer.size() > 0) {
 queue.add(buffer);
 }
  }

 尝试一下 (BufferedWriter 作家 =  BufferedWriter( FileWriter(outputFile))) {
 while (!queue.isEmpty()) {
 文件缓冲区 缓冲区 =queue.poll();
 Writer.write(buffer.popNextLine());
 作家。 newLine();
 if (buffer.size() > 0) {
 FileBuffer nextBuffer = 新建 FileBuffer(buffer.file);
 nextBuffer.readNextLine();
queue.add(nextBuffer); 
 }
 }
 }
 }

 静态  span> FileBuffer 实现 可比较 {
 BufferedReader reader;
 字符串行;
 文件文件;
 int 大小;

 public 文件缓冲区(文件文件)  IOException {
 这个.file = file;
 这个.reader =  BufferedReader(FileReader(文件));
this.size = (int) file.length();
 this.line = Reader.readLine();
 }

 公共 int 大小() {
 返回大小;
 }

 public String popNextLine() 抛出 IOException {
 字符列 临时 =行;
行=Reader.readLine();
 返回 temp;
 }

 @Override
 public int compareTo(FileBuffer 其他) {
 返回 Integer.compare(这个.size(), other.size());
 }
 }
}

这个该示例首先将输入文件拆分为多个小块,然后对每个小块进行排序并将其保存到临时文件中。 然后,它使用优先级队列(最小堆)将所有已排序的小块合并到一个有序的大文件中。

以上内容来源于互联网,不代表本站全部观点。 欢迎关注:zhujipindao.com

未经允许不得转载:主机频道 » Java中如何实现外部排序(堪比Java排序)

评论 抢沙发

评论前必须登录!