外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。选自百度百科。
第一步: 首先我们先来创建一个大号的文件。
public class Sort {
public static void main(String[] args) throws IOException{
File file=new File("E:/排序/source.txt");
int numCount=10000000;
Random r=new Random();
if(file.exists())file.delete();
FileWriter fw=new FileWriter(file);
for(int i=0;i<numCount;i++){
fw.write(r.nextInt()+"\n");
}
fw.close();
}
文件不是很大,也就107M左右,当然我们可以修改numCount来让这个文件变得更大。
第二步,外部排序,以下是完整代码
package sort;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Sort {
public static void main(String[] args) throws IOException{
File file=new File("E:/排序/source.txt");
BufferedReader fr=new BufferedReader(new FileReader(file));//源数据文件读取。
final int SIZE=10000;//这里是定义我们将源文件中以10000条记录作为单位进行分割。
int[] nums=new int[SIZE];//临时存放分割时的记录
List<String> fileNames=new ArrayList<String>();//保存所有分割文件的名称
int index=0;
while(true){
String num=fr.readLine();//从原文件中读取一条记录
if(num==null){//如果读取完毕后,进行一次排序并保存
fileNames.add(sortAndSave(nums,index));
break;
}
nums[index]=Integer.valueOf(num);
index++;
if(index==SIZE){//当nums里面读的数字到达长度边界时,排序,存储
fileNames.add(sortAndSave(nums,index));//sortAndSave是将nums中前index条记录先快速排序,然后存入文件,最好将文件名返回。
index=0;//重置index
}
}
fr.close();
mergeSort(fileNames);//将所有fileNames的文件进行合并
}
//sortAndSave是将nums中前index条记录先快速排序,然后存入文件,最好将文件名返回
public static String sortAndSave(int[] nums,int size) throws IOException{
quicksort.sort(nums,0, size-1);
String fileName="E:/排序/sort"+System.nanoTime()+".txt";
File rf=new File(fileName);
BufferedWriter bw=new BufferedWriter(new FileWriter(rf));
for(int i=0;i<nums.length;i++)bw.write(nums[i]+ "\n");
bw.close();
return fileName;
}
public static void mergeSort(List<String> fileNames) throws IOException{
List<String> tempFileNames=new ArrayList<String>();
for(int i=0;i<fileNames.size();i++){
String resultFileName="E:/排序/sort"+System.nanoTime()+".txt";
File resultFile=new File(resultFileName);
tempFileNames.add(resultFileName);
BufferedWriter bw=new BufferedWriter(new FileWriter(resultFile));
File file1=new File(fileNames.get(i++));
BufferedReader br1=new BufferedReader(new FileReader(file1));
if(i<fileNames.size()){
File file2=new File(fileNames.get(i));
BufferedReader br2=new BufferedReader(new FileReader(file2));
int num1=0;
int num2=0;
boolean isFirst=true;
boolean firstNext=true;
String numVal1=null,numVal2=null;
for(;;){
if(isFirst){
numVal1=br1.readLine();
numVal2=br2.readLine();
num1=Integer.valueOf(numVal1);
num2=Integer.valueOf(numVal2);
isFirst=false;
}
else if(firstNext)
numVal1=br1.readLine();
else
numVal2=br2.readLine();
if(numVal1!=null && numVal2!=null){
if(firstNext){
num1=Integer.valueOf(numVal1);
}else{
num2=Integer.valueOf(numVal2);
}
if(num1<num2){
bw.write(num1+"\n");
firstNext=true;
}else{
bw.write(num2+"\n");
firstNext=false;
}
}else{
if(numVal1!=null)bw.write(numVal1+"\n");
if(numVal2!=null)bw.write(numVal2+"\n");
break;
}
}
while(true){
numVal2=br2.readLine();;
if(numVal2!=null)bw.write(numVal2+"\n");
else break;
}
br2.close();
file2.delete();
}
while(true){
String numVal1=br1.readLine();
if(numVal1!=null){
bw.write(numVal1+"\n");
}
else break;
}
br1.close();
file1.delete();
bw.close();
}
int size=tempFileNames.size();
if(size>1){
mergeSort(tempFileNames);
}else if(size==1){
File file=new File(tempFileNames.get(0));
file.renameTo(new File("E:/排序/result.txt"));
}
}}
//快速排序
class quicksort {
public static void sort(int data[],int low,int hight){
quicksort qs=new quicksort();
qs.data=data;
qs.sort(low, hight);
}
public int data[];
private int partition(int sortArray[], int low, int hight) {
int key = sortArray[low];
while (low < hight) {
while (low < hight && sortArray[hight] >= key)hight--;
sortArray[low] = sortArray[hight];
while (low < hight && sortArray[low] <= key)low++;
sortArray[hight] = sortArray[low];
}
sortArray[low] = key;
return low;
}
public void sort(int low, int hight) {
if (low < hight) {
int result = partition(data, low, hight);
sort(low, result - 1);
sort(result + 1, hight);
}
}
public void display() {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]);
System.out.print(" ");
}
}
}
分享到:
相关推荐
用java实现基于整数(int)的外部排序
有文件大小为1G的一个文件,文件每行存储的为URL及其访问次数,例如/api/auth/login 2 ,计算出访问次数最多的前5个URL和其访问次数,每行的URL可能重复,计算内存限制10M。 === 内含解题思路、测试结果截图、可运行...
Java实现外部归并排序的过程包括以下几个关键步骤: 1. **划分阶段**: - 将原始数据分割成多个小文件,每个文件包含可以一次性加载到内存中的数据量。这通常通过创建一系列的子序列(也称为块或桶)完成。 - 对...
在Java中,我们可以使用Collections.sort()方法,但为了处理大文件,可能需要自定义一个适配外部排序的版本。 此外,多线程技术可以用来加速处理。通过将任务分解为多个子任务并分配给不同的线程,可以并行处理文件...
在本文中,我们将深入探讨内部排序算法,包括它们的工作原理、优缺点以及如何使用Python、JavaScript、Java、Go和PHP这些编程语言来实现它们。 1. 冒泡排序:冒泡排序是一种简单的交换排序方法,通过不断比较相邻...
内部排序是指在内存中完成的排序过程,它不涉及外部存储器交互。这六种排序算法可能包括常见的快速排序、归并排序、插入排序、选择排序、冒泡排序以及堆排序。接下来,我们将对每一种排序算法进行详细介绍,并结合...
### Java实现归并排序算法(源代码)知识点详解 #### 一、归并排序概述 归并排序是一种经典的排序算法,其核心思想是分而治之。它将一个大问题分解为若干个相同的小问题来解决,最终通过合并这些小问题的解来得到...
在Java中实现这些排序算法,可以使用数组作为基础数据结构,通过方法调用来实现不同类型的排序。例如,`bubbleSort`方法实现了冒泡排序,`swap`方法用于交换数组元素,`createArray`用于生成随机测试数据,`...
而外部排序则涉及到内存和磁盘之间的数据交换,用于处理大规模数据。本篇主要关注内部排序,它包括五种主要类型:插入排序、选择排序、交换排序、归并排序和分配排序。 插入排序是一种简单直观的排序算法,分为直接...
Java 中的排序可以分为三种类型:简单类型排序、内部对象实现 Comparable 和外部对象实现 Comparator。 简单类型排序 简单类型包括 byte, char, short, int, long, float, double 等数据类型。这些类型不能放在...
然而,由于其稳定性(相同的元素在排序后保持原有的相对顺序),归并排序在处理包含重复元素的序列时表现优秀,尤其是在大数据集或外部排序中。 总之,归并排序是一种基于分治策略的排序算法,通过递归地将序列分解...
在Java中实现外部排序,可以创建一个BufferedReader或Scanner来读取文件,每次读取一部分数据,然后用Java内置的排序函数对这部分数据进行排序。之后,将排序后的数据写入一个新的临时文件。重复这个过程,直到所有...
Java实现归并外排序时,通常会用到以下几个关键类和方法: - `FileReader` 和 `BufferedReader`:用于读取文件。 - `FileWriter` 和 `BufferedWriter`:用于写入文件。 - `ArrayList` 或其他集合类:存储块中的数据...
在Java编程中,处理大文件并...总的来说,Java处理大文件多字段排序需要结合外部排序算法和自定义比较器,同时考虑内存限制和I/O性能优化。在实际应用中,可以结合Java的并发特性以及第三方库,提高排序效率和灵活性。
标题中的“各种排序算法java实现”意味着我们将探讨Java编程语言中实现的不同排序算法。排序算法是计算机科学的基础,它们在处理数据时起着至关重要的作用,尤其是在大数据和高性能计算领域。Java提供了多种内置方法...
在JAVA实现中,需要定义好几个关键的函数,比如maxheap用于调整堆结构,buildmaxheap用于建立最大堆,以及maxheapsort用于进行堆排序。这几个函数需要仔细设计以确保在非递归环境下正确无误地运行。 在堆排序算法中...
在Java Swing中,我们可以通过JFrame、JButton、JTable等组件来构建用户界面,同时,IO(输入/输出)操作则用于与外部文件系统进行交互,如读取、写入数据。排序则是数据处理中的常见需求,无论是对数组还是集合,都...
本项目主要使用Java实现各种经典常用数据结构及其算法,包括但不仅限于链表、栈,队列,树,图等经典数据结构。 八大排序算法及其实现,具体包括直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序...
- **外部排序**:数据量巨大时,需要借助外部存储器(如磁盘)完成排序。 #### 内部排序算法 内部排序算法可以进一步细分为以下几种: 1. **选择排序** - **直接选择排序**:每次从未排序的部分选出最小(或最大...
在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...