吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1182|回复: 0
收起左侧

[Java 转载] 【Java】数据结构-归并排序(完整代码)

[复制链接]
孤樱懶契 发表于 2021-6-27 22:27
本帖最后由 孤樱懶契 于 2021-10-23 22:40 编辑

归并排序执行结果截图

image-20210627222351301

归并排序执行(完整代码)

MergeSort.java

import java.lang.reflect.Array;
import java.util.Arrays;

public class MergeSort {

    private MergeSort(){}

    public static <E extends Comparable<E>> void sort(E[] arr){
        sort(arr, 0 , arr.length-1);
    }

    private static <E extends Comparable<E>>void sort(E[] arr, int l , int r){
        if(l >= r) return;

        int mid  = (l  +  r ) / 2;
        sort(arr, l, mid);
        sort(arr, mid+1, r);
        merge(arr, l , mid , r);
    }

    // 合并两个有序的区间 arr[l...mid] 和 arr[mid + 1, r]
    private static <E extends Comparable<E>> void merge(E[] arr, int l , int mid, int r){

        E[] temp = Arrays.copyOfRange(arr, l , r + 1); //前闭后开,所以要r+1

        int i = l, j = mid + 1;

        //每轮循环为arr[k]赋值
        for(int k = l ; k <= r ; k ++){

            if(i > mid) {
                arr[k] = temp[j - l]; j ++;
            }
            else if(j > r){
                arr[k] = temp[i - l]; i ++;
            }
            else if(temp[i - l].compareTo(temp[j - l]) <= 0){
                arr[k] = temp[i - l]; i ++;
            }
            else{
                arr[k] = temp[j - l]; j ++;
            }
            // arr[i] 和 arr[j]

        }
    }

    public static void main(String[] args){

        int n = 100000;
        Integer[] arr = ArrayGenerator.generateRandomArray(n, n);
        MergeSort.sort(arr);
        for(int i = 0 ; i < n ; i++){
            System.out.println(arr[i]);
        }
    }
}

ArrayGenerator.java(生成随机n个元素的数组)

import java.util.Random;

public class ArrayGenerator {

    private ArrayGenerator(){}

    public static Integer[] generateOrderedArray(int n){

       Integer[] arr = new Integer[n];
       for(int i = 0; i < n ; i++)
           arr[i] = i;
       return arr;
    }

    // 生成一个长度为 n 的随机数组, 每个数字的范围是[ 0 , bound)
    public static Integer[] generateRandomArray(int n, int bound){

        Integer[] arr = new Integer[n];
        Random rnd = new Random();
        for(int i = 0 ; i < n; i++)
            arr[i] = rnd.nextInt(bound); //从0到bound前闭后开
        return arr;
    }
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表