`
ssxxjjii
  • 浏览: 948748 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

完整java实现外部排序

 
阅读更多

外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。选自百度百科。

第一步:      首先我们先来创建一个大号的文件。

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(" ");
  }
 }
}

分享到:
评论
1 楼 abao1 2018-05-03  
发现一个小问题 sortAndSave方法中的for循环 第二个参数应该用size吧

相关推荐

    用java实现基于整数(int)的外部排序

    用java实现基于整数(int)的外部排序

    Java实现外部排序(10M内存排序1G大文件)

    有文件大小为1G的一个文件,文件每行存储的为URL及其访问次数,例如/api/auth/login 2 ,计算出访问次数最多的前5个URL和其访问次数,每行的URL可能重复,计算内存限制10M。 === 内含解题思路、测试结果截图、可运行...

    外部归并排序Java实现

    Java实现外部归并排序的过程包括以下几个关键步骤: 1. **划分阶段**: - 将原始数据分割成多个小文件,每个文件包含可以一次性加载到内存中的数据量。这通常通过创建一系列的子序列(也称为块或桶)完成。 - 对...

    Java 大文件读取排序

    在Java中,我们可以使用Collections.sort()方法,但为了处理大文件,可能需要自定义一个适配外部排序的版本。 此外,多线程技术可以用来加速处理。通过将任务分解为多个子任务并分配给不同的线程,可以并行处理文件...

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    在本文中,我们将深入探讨内部排序算法,包括它们的工作原理、优缺点以及如何使用Python、JavaScript、Java、Go和PHP这些编程语言来实现它们。 1. 冒泡排序:冒泡排序是一种简单的交换排序方法,通过不断比较相邻...

    JAVA写的6种内部排序算法简单实现

    内部排序是指在内存中完成的排序过程,它不涉及外部存储器交互。这六种排序算法可能包括常见的快速排序、归并排序、插入排序、选择排序、冒泡排序以及堆排序。接下来,我们将对每一种排序算法进行详细介绍,并结合...

    Java实现归并排序算法(源代码)

    ### Java实现归并排序算法(源代码)知识点详解 #### 一、归并排序概述 归并排序是一种经典的排序算法,其核心思想是分而治之。它将一个大问题分解为若干个相同的小问题来解决,最终通过合并这些小问题的解来得到...

    数据结构java版 排序算法

    在Java中实现这些排序算法,可以使用数组作为基础数据结构,通过方法调用来实现不同类型的排序。例如,`bubbleSort`方法实现了冒泡排序,`swap`方法用于交换数组元素,`createArray`用于生成随机测试数据,`...

    java排序算法实现

    而外部排序则涉及到内存和磁盘之间的数据交换,用于处理大规模数据。本篇主要关注内部排序,它包括五种主要类型:插入排序、选择排序、交换排序、归并排序和分配排序。 插入排序是一种简单直观的排序算法,分为直接...

    java中的排序.ppt

    Java 中的排序可以分为三种类型:简单类型排序、内部对象实现 Comparable 和外部对象实现 Comparator。 简单类型排序 简单类型包括 byte, char, short, int, long, float, double 等数据类型。这些类型不能放在...

    java实现归并排序算法

    然而,由于其稳定性(相同的元素在排序后保持原有的相对顺序),归并排序在处理包含重复元素的序列时表现优秀,尤其是在大数据集或外部排序中。 总之,归并排序是一种基于分治策略的排序算法,通过递归地将序列分解...

    Java方法排序五百万数据

    在Java中实现外部排序,可以创建一个BufferedReader或Scanner来读取文件,每次读取一部分数据,然后用Java内置的排序函数对这部分数据进行排序。之后,将排序后的数据写入一个新的临时文件。重复这个过程,直到所有...

    java归并外排序

    Java实现归并外排序时,通常会用到以下几个关键类和方法: - `FileReader` 和 `BufferedReader`:用于读取文件。 - `FileWriter` 和 `BufferedWriter`:用于写入文件。 - `ArrayList` 或其他集合类:存储块中的数据...

    java 大文件 多字段排序

    在Java编程中,处理大文件并...总的来说,Java处理大文件多字段排序需要结合外部排序算法和自定义比较器,同时考虑内存限制和I/O性能优化。在实际应用中,可以结合Java的并发特性以及第三方库,提高排序效率和灵活性。

    各种排序算法java实现

    标题中的“各种排序算法java实现”意味着我们将探讨Java编程语言中实现的不同排序算法。排序算法是计算机科学的基础,它们在处理数据时起着至关重要的作用,尤其是在大数据和高性能计算领域。Java提供了多种内置方法...

    堆排序的非递归算法分析与JAVA实现

    在JAVA实现中,需要定义好几个关键的函数,比如maxheap用于调整堆结构,buildmaxheap用于建立最大堆,以及maxheapsort用于进行堆排序。这几个函数需要仔细设计以确保在非递归环境下正确无误地运行。 在堆排序算法中...

    java swing io 排序的几个小实例

    在Java Swing中,我们可以通过JFrame、JButton、JTable等组件来构建用户界面,同时,IO(输入/输出)操作则用于与外部文件系统进行交互,如读取、写入数据。排序则是数据处理中的常见需求,无论是对数组还是集合,都...

    常用数据结构及其算法的Java实现

    本项目主要使用Java实现各种经典常用数据结构及其算法,包括但不仅限于链表、栈,队列,树,图等经典数据结构。 八大排序算法及其实现,具体包括直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序...

    几种经典排序算法的Java实现

    - **外部排序**:数据量巨大时,需要借助外部存储器(如磁盘)完成排序。 #### 内部排序算法 内部排序算法可以进一步细分为以下几种: 1. **选择排序** - **直接选择排序**:每次从未排序的部分选出最小(或最大...

    java排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...

Global site tag (gtag.js) - Google Analytics