【外部排序算法】

本文详细介绍了内排序(如冒泡、插入、希尔、归并等)和外部排序(如多路归并)的概念,以及它们的时间复杂度和空间复杂度。特别关注了常见排序算法在这些方面的表现。
摘要由CSDN通过智能技术生成

排序介绍

复杂度

时间复杂度

空间复杂度

内部排序

内排序是被排序的数据元素全部存放在计算机内存中的排序算法。 内部排序是指待排的记录全部在内存中完成排序的过程,内部排序也称为内排序。

项目空间复杂度时间复杂度(平均)时间复杂度(最好)时间复杂度(最坏)排序方式稳定排序
冒泡排序O(1)O( n 2 n^2 n2)O( n n n)O( n 2 n^2 n2)内排序
选择排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
插入排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
希尔排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
归并排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)外排序
快速排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
堆排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
计数排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
桶排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序
基数排序O(1)O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)内排序

外部排序

外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。
外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序

import java.io.*;
import java.util.*;

public class ExternalSort {

    // 假设每个文件(块)可以加载的最大行数
    private static final int MAX_TEMP_FILE_LINES = 1000;

    public static void main(String[] args) throws IOException {
        String inputFile = "input.txt"; // 输入文件
        String outputFile = "sorted.txt"; // 输出文件
        externalSort(inputFile, outputFile);
    }

    public static void externalSort(String inputFile, String outputFile) throws IOException {
        List<File> tempFiles = splitAndSortTempFiles(inputFile);
        mergeSortedFiles(tempFiles, outputFile);
        deleteTempFiles(tempFiles);
    }

    private static List<File> splitAndSortTempFiles(String inputFile) throws IOException {
        List<File> tempFiles = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new FileReader(inputFile));
        List<String> lines = new ArrayList<>(MAX_TEMP_FILE_LINES);
        String line;
        while ((line = reader.readLine()) != null) {
            lines.add(line);
            if (lines.size() == MAX_TEMP_FILE_LINES) {
                tempFiles.add(sortAndSave(lines));
                lines.clear();
            }
        }
        if (!lines.isEmpty()) {
            tempFiles.add(sortAndSave(lines));
            lines.clear();
        }
        reader.close();
        return tempFiles;
    }

    private static File sortAndSave(List<String> lines) throws IOException {
        Collections.sort(lines);
        File tempFile = File.createTempFile("sortInBatch", ".tmp");
        tempFile.deleteOnExit();
        BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
        for (String r : lines) {
            writer.write(r);
            writer.newLine();
        }
        writer.close();
        return tempFile;
    }

    private static void mergeSortedFiles(List<File> files, String outputFileName) throws IOException {
        PriorityQueue<BufferedReader> pq = new PriorityQueue<>(11,
                Comparator.comparing(bufferedReader -> {
                    try {
                        return bufferedReader.readLine();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return null;
                    }
                }));

        for (File file : files) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            pq.add(br);
        }

        BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName));
        while (!pq.isEmpty()) {
            BufferedReader br = pq.poll();
            String line = br.readLine();
            if (line != null) {
                writer.write(line);
                writer.newLine();
                pq.add(br); // 重新加入队列进行下一行的排序
            } else {
                br.close();
            }
        }
        writer.close();
    }

    private static void deleteTempFiles(List<File> tempFiles) {
        for (File file : tempFiles) {
            file.delete();
        }
    }
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值