针对大文件,一次无法全部读入内存,可以采用将内容保存到文件的方式,进行归并;
可以改进之处,即分割文件,多线程,多机器处理;可以大大提高效率
package com.xiva.demo.sort; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.util.Arrays; import java.util.LinkedList; import org.apache.commons.io.IOUtils; public class SortPractice<E extends Comparable<E>> { private static int fileTempNum = 0; /** * 归并排序 * @param array * @param low * @param high [参数说明] * * @return void [返回类型说明] * @exception throws [违例类型] [违例说明] * @see [类、类#方法、类#成员] */ @SuppressWarnings("unchecked") public void merge(E[] array, int low, int high) { int mid = (high + low) / 2; int s1 = low; int s2 = mid + 1; Object[] tempArr = new Object[high - low + 1]; int tempIdx = 0; while (s1 <= mid && s2 <= high) { if (array[s1].compareTo(array[s2]) <= 0) { tempArr[tempIdx] = array[s1++]; tempIdx++; } else { tempArr[tempIdx] = array[s2++]; tempIdx++; } } if (s1 <= mid) { for (int i = s1; i <= mid; i++) { tempArr[tempIdx] = array[i]; tempIdx++; } } if (s2 <= high) { for (int i = s2; i <= high; i++) { tempArr[tempIdx] = array[i]; tempIdx++; } } for (int i = 0; i < tempArr.length; i++) { array[low + i] = (E)tempArr[i]; } } public void mergeSort(E[] array, int low, int high) { if (low < high) { mergeSort(array, low, (high + low) / 2); mergeSort(array, (high + low) / 2 + 1, high); merge(array, low, high); } } public static void testmerge(int maxLineRead) throws IOException { File file = new File("E:\\data\\msisdn.txt"); LinkedList<String> numList = new LinkedList<String>(); BufferedReader bReader = new BufferedReader(new FileReader(file)); LineNumberReader lineReader = new LineNumberReader(new FileReader(file)); int tempFileNum = getLineNumber(lineReader, maxLineRead); File[] fileArray = new File[tempFileNum]; for (int i = 0; i < tempFileNum; i++) { File tempFile = new File("E:\\data\\msisdnSort" + i + ".txt"); fileArray[i] = tempFile; if (!tempFile.exists()) { tempFile.createNewFile(); } } String line = bReader.readLine(); long startTime = System.currentTimeMillis(); int lineIndex = 1; int fileIndex = 0; while (line != null) { String trimLine = line.trim(); if (!trimLine.equals("")) { numList.add(trimLine); } line = bReader.readLine(); lineIndex++; if (lineIndex > maxLineRead) { lineIndex = 1; FileOutputStream oStream = new FileOutputStream( fileArray[fileIndex], true); outputResult2File(numList, oStream); fileIndex++; numList = new LinkedList<String>(); } } if (numList.size() > 0) { FileOutputStream oStream = new FileOutputStream( fileArray[fileIndex], true); outputResult2File(numList, oStream); } long endTime = System.currentTimeMillis(); System.out.println("MergeSort Time:" + (endTime - startTime)); mergeSortUseFile(fileArray); long outTime = System.currentTimeMillis(); System.out.println("MergeFile Time:" + (outTime - endTime)); } private static int getLineNumber(LineNumberReader lineReader, int maxLineRead) throws IOException { String line = lineReader.readLine(); while (line != null) { line = lineReader.readLine(); } int lineNum = lineReader.getLineNumber(); int tempFileNum = lineNum / maxLineRead; if (lineNum % maxLineRead != 0) { tempFileNum = tempFileNum + 1; } return tempFileNum; } private static void outputResult2File(LinkedList<String> numList, FileOutputStream oStream) throws IOException { SortPractice<String> sort = new SortPractice<String>(); int size = numList.size(); String[] array = new String[size]; for (int j = 0; j < size; j++) { array[j] = numList.removeFirst(); } sort.mergeSort(array, 0, size - 1); for (int i = 0; i < array.length; i++) { IOUtils.write(array[i], oStream); IOUtils.write(System.getProperty("line.separator"), oStream); } } public static void mergeSortUseFile(File[] fileArray) throws IOException { int arrLen = fileArray.length; if (arrLen < 2) { return; } int tempFileNum = arrLen / 2; if (arrLen % 2 != 0) { tempFileNum = tempFileNum + 1; } File[] tempFileArray = new File[tempFileNum]; for (int i = 0; i < tempFileNum; i++) { File tempFile = new File("E:\\data\\msisdnMerge" + fileTempNum + i + ".txt"); tempFileArray[i] = tempFile; if (!tempFile.exists()) { tempFile.createNewFile(); } } fileTempNum = fileTempNum + tempFileNum; int fileIndex = 1; while (fileIndex < arrLen) { mergeFile(fileArray[fileIndex - 1], fileArray[fileIndex], tempFileArray[fileIndex / 2]); fileIndex = fileIndex + 2; } if(arrLen%2 != 0) { tempFileArray[tempFileNum - 1] = fileArray[arrLen - 1]; } mergeSortUseFile(tempFileArray); } public static void mergeFile(File file1, File file2, File tempFile) throws IOException { BufferedReader file1Reader = new BufferedReader(new FileReader(file1)); BufferedReader file2Reader = new BufferedReader(new FileReader(file2)); FileOutputStream oStream = new FileOutputStream(tempFile, true); String obj1 = file1Reader.readLine(); String obj2 = file2Reader.readLine(); while (obj1 != null && obj2 != null) { if (obj1.compareTo(obj2) <= 0) { IOUtils.write(obj1, oStream); IOUtils.write(System.getProperty("line.separator"), oStream); obj1 = file1Reader.readLine(); } else { IOUtils.write(obj2, oStream); IOUtils.write(System.getProperty("line.separator"), oStream); obj2 = file2Reader.readLine(); } } if (obj1 != null) { while (obj1 != null) { IOUtils.write(obj1, oStream); IOUtils.write(System.getProperty("line.separator"), oStream); obj1 = file1Reader.readLine(); } } if (obj2 != null) { while (obj2 != null) { IOUtils.write(obj2, oStream); IOUtils.write(System.getProperty("line.separator"), oStream); obj2 = file2Reader.readLine(); } } } public static void testArraySort() { SortPractice<Integer> sort = new SortPractice<Integer>(); Integer num01 = new Integer(12); Integer num02 = new Integer(13); Integer num03 = new Integer(44); Integer num04 = new Integer(3); Integer num05 = new Integer(13); Integer num06 = new Integer(5); Integer num07 = new Integer(7); Integer[] array = {num01, num02, num03, num04, num05, num06, num07, num04, num06, num01}; sort.mergeSort(array, 0, array.length - 1); System.out.println(Arrays.toString(array)); } public static void main(String[] args) throws IOException { testmerge(100000); } }
相关推荐
改进的归并排序算法,两种方式 1 是不回写, 2是 非递归
MATLAB实现《算法设计与分析》中的插入排序、二分归并排序、归并排序实验,其中包括.m文件和实验报告,安徽大学本科课程。
归并排序C语言实现
快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。
归并排序,比较高效的排序算法之一。这是一个例子,一个关于归并排序的例子。
直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码 使用C#实现的数据结构中的排序算法
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
java 实现归并排序,有代码实现,复杂度分析,基本步骤,适合初学者吧,
快速排序、归并排序、改进的归并排序算法的C++代码。(含测试用例,代码逻辑清晰可运行。) (划分子区间,分别对左右子区间进行排序,开始归并已经排好序的low到high...改进后的归并排序对数组元素下标进行标记。)
C语言二路归并排序算法, 写了个二路归并的归并排序小代码,直接贴上来
C语言算法之归并排序C语言算法之归并排序C语言算法之归并排序C语言算法之归并排序
根据算法导论实现的归并排序算法
插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
试通过随机数据比较归并排序、基数排序各算法的关键字比较次数和关键字移动次数。 (1)待排序表的表长不小于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入...(3)对归并排序应指出归并了多少趟。
排序算法可以单线程执行(适用于小文件),也可以多线程执行(适用于大文件,分隔排序后再归并); 使用了如下技术要点: 命令行参数 面向对象 字符串解析 文件读取,写入 多线程、线程池、队列、线程同步 文件归并...
实现归并排序的一个类
自己写的三个排序算法的比较。快速排序、归并排序、简单排序 对三个排序算法所消耗时间进行统计,比较时间效率 程序是在Linux下用C写的,vc下并未做测试。
归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"...