如何实现基于多路归并的外排序
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容主要讲解"如何实现基于多路归并的外排序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现基于多路归并的外排序"吧!import com.goo
千家信息网最后更新 2025年01月31日如何实现基于多路归并的外排序
本篇内容主要讲解"如何实现基于多路归并的外排序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现基于多路归并的外排序"吧!
import com.google.common.collect.Lists;import java.io.*;import java.util.*;/** * 对远远大于内存的数据进行外排序,先将文件分割为内存可以单独处理多个小文件, * 在内存中对这些小文件进行排序,然后多路归并将这些文件合并成最终的有序大文件 * */public class ExternalSort { public static int BUFFER_SIZE = 1024 * 4 * 1000; // 一次缓冲读取 public static int LITTLE_FILE_SIZE = 10; // 每个文件的记录数 public static File IN_FILE = new File("data/f1.txt");//要排序的文件 public static File OUT_FILE = new File("data/concat");//输出合并后的有序的文件 /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //排序 long start = System.currentTimeMillis(); new ExternalSort().mSort(IN_FILE); long end = System.currentTimeMillis(); System.out.println((end - start) / 1000 + "s"); } /** * 多路归并 * * @param file * @throws IOException */ public void mSort(File file) throws IOException { Listfiles = split(file); // 分割成小文件并加载到内存排序 multMerge(files); //归并 } /** * Splits the original file into a number of sub files. */ public List split(File file) throws IOException { List files = Lists.newArrayList(); BufferedReader din = new BufferedReader(new FileReader(file), BUFFER_SIZE); int[] buffer = new int[LITTLE_FILE_SIZE]; boolean fileCompleted = false; while (!fileCompleted) { int len = buffer.length; for (int i = 0; i < buffer.length && !fileCompleted; i++) { try { buffer[i] = Integer.parseInt(din.readLine()); } catch (NumberFormatException | IOException e) { fileCompleted = true; len = i; } } //将buffer数据排序写入文件 if (len > 0) { Arrays.sort(buffer, 0, len); File f = new File("data/set" + new Random().nextInt()); BufferedWriter dout = new BufferedWriter(new FileWriter(f)); for (int i = 0; i < len; i++) { dout.write(buffer[i]+"\n"); } dout.close(); files.add(f); } } din.close(); return files; } /** * 多路归并 * * @param files * @throws IOException */ public static void multMerge(List files) throws IOException { //构建输出缓冲流 BufferedWriter out = new BufferedWriter(new FileWriter(OUT_FILE), BUFFER_SIZE); //构建输入缓冲流 List inList = Lists.newArrayList(); int size = files.size(); for (int i = 0; i < size; i++) { inList.add(i,new BufferedReader(new FileReader(files.get(i)), BUFFER_SIZE)); } //构建一个数组,存放从每个输入流里取出来的数据 int[] ext = new int[size]; int left = size; //定义剩余文件数 for (int i = 0; i < size; i++) { try { ext[i] = Integer.parseInt(inList.get(i).readLine()); } catch (Exception e) { ext[i] = -1; left--; inList.get(i).close(); } } //将ext数组中最小值写入文件 while (left > 0) { int ind = getMinIndex(ext); out.write(ext[ind]+"\n"); //然后从相应的输入流中取出下一个数据 try { ext[ind] = Integer.parseInt(inList.get(ind).readLine()); } catch (Exception e) { ext[ind] = -1; left--; inList.get(ind).close(); } } out.close(); } //找到数据中最小的一个 public static int getMinIndex(int[] ext) { //找到第一个不为-1的元素 int min; int inx = 0; while (true) { if (ext[inx] != -1) { min=ext[inx]; break; } else { inx++; } } for (int i = 1; i < ext.length; i++) { if (ext[i] < min && ext[i] != -1) { min = ext[i]; inx = i; } } return inx; }}
到此,相信大家对"如何实现基于多路归并的外排序"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
文件
多路
内存
数据
排序
缓冲
输入
有序
内容
学习
输出
实用
更深
最小
件数
元素
兴趣
多个
实用性
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
新基建网络安全解读
河南武功网络技术培训学校
网络安全的运作方式
软件开发mdt是啥
金灿荣说网络技术
网络安全主要义务是什么
河南最好的软件开发学校
青少年网络安全风险
智能化互联网科技
网络安全博士如何
银行软件开发工资待遇
亚马逊物流软件开发经理
网络安全怎样理解
数据库安全控制针对
社区开展网络安全宣讲活动
网络安全专家讲座主持词结束语
亿网通达网络技术有限公司
饥荒联机版打开独立服务器
稳定服务器找哪家
wincc pc如何作为服务器
温州工业软件开发总结
仕航软件开发有限公司怎么样
网络安全密钥怎么填写
王珊数据库原理ppt
浪潮服务器上raid怎么做
华为服务器事业部
服务器不能登录安全模式
河南电脑软件开发如何收费
清远百家互联网科技有限公司
浮生若梦字体软件开发