如何实现基于多路归并的外排序
发表于:2025-11-20 作者:千家信息网编辑
千家信息网最后更新 2025年11月20日,本篇内容主要讲解"如何实现基于多路归并的外排序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现基于多路归并的外排序"吧!import com.goo
千家信息网最后更新 2025年11月20日如何实现基于多路归并的外排序
本篇内容主要讲解"如何实现基于多路归并的外排序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现基于多路归并的外排序"吧!
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 { List files = 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安全错误
数据库的锁怎样保障安全
一般数据库放在linux
虚拟主机开服务器
通信网络安全防护措施情况
一部关于网络安全带电视
支付行业软件开发
国家会不会招网络安全
金融基础软件开发
企业常用的关系型数据库
生活中如何打开数据库
怎么看数据库登录密码
系统集成vs软件开发
阿里ecs云服务器防护
雷昶卓景网络技术
手机直播租服务器
某某支行全面开展网络安全宣传
马鞍山oa管理软件开发哪家好
幼儿网络安全第一课教育教案
2020中国网络安全大会
校园招聘平台的软件开发
软件开发维保款确认收入么
金蝶商贸标准引入初始数据库
中信所软件开发
银川的软件开发
莆田星语网络技术有限公司
福州日日互联网科技有限公司
单打独斗怎么解决网络安全问题
合作单位管理软件开发
都昌软件开发文档
乡镇 网络安全应急响应预案
查看数据库漏洞