首页 > 编程语言 >归并排序Java

归并排序Java

时间:2022-10-02 23:13:35浏览次数:99  
标签:归并 right Java int arr mid high low 排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

其思想为:
分解:分解待排序的n个元素的序列成各具n/2个元素的子序列
解决:使用归并排序递归地排序两个子序列
合并:合并两个已排序的子序列以产生已排序的答案

归并排序的关键步骤为合并。

可以通过调用一个merge(int[] arr,int low,int mid,int high)过程来完成合并,其中arr为一个数组,low,mid,high为数组下标,假设数组中low--mid,mid+1--high均已排列好,此过程用于将之排列好为low--high的数组。

merge实现思路如下:
将传入的数组arr按照传入的数组下标从low到mid和从mid+1到high,依次将值复制到left和right两个数组,并为left和right末尾设置“哨兵”,用于标记数组末尾。因此left和right的长度均需在原有的基础上加一。
在得到left和right后,可将其视作牌面朝上、排列好的扑克牌,现在可以通过一个循环,每次取牌面最小的那张牌并插入到arr数组的low位置起直至high位置,即可实现两个数组的排列。这个过程前需将哨兵设置为无穷大,便于for循环的判断。

现在可将merge视作一个子程序,实现一个sort(int[] arr,int low,int high)来调用merge。
sort程序先判断low是否小于high,若是则将之分解为low--mid,mid+1--high两个数组,依次调用sort,最后调用merge来实现数组的归并。

Java实现如下:
MergeSort.java

public class MergeSort {
    public void sort(int[] arr, int low, int high) {
        if (low < high) {
            int mid = (low + high) / 2;
            sort(arr, low, mid);
            sort(arr, mid + 1, high);
            merge(arr, low, mid, high);
        }
    }

    void merge(int[] arr, int low, int mid, int high) {
        int[] left = new int[mid - low + 2];
        int[] right = new int[high - mid + 1];
        for (int i = 0; i < left.length - 1; i++) {
            left[i] = arr[low + i];
        }
        left[left.length - 1] = 2147483647;//哨兵
        for (int i = 0; i < right.length - 1; i++) {
            right[i] = arr[mid + i + 1];
        }
        right[right.length - 1] = 2147483647;
        int j = 0;
        int k = 0;
        for (int i = low; i <= high; i++) {
            if (left[j] <= right[k]) {
                arr[i] = left[j];
                j++;
            } else {
                arr[i] = right[k];
                k++;
            }
        }
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        int[] arr={2,3,6,5,4,7,8,9,5,2,1,4,5,2,3,6,9,8,7,1,0,2,3,6,45,4,5,6,5,8,5};
        System.out.println(Arrays.toString(arr));
        new MergeSort().sort(arr, 0, arr.length-1);
        System.out.println("  ||\n  ||\n  \\/");
        System.out.println(Arrays.toString(arr));
    }
}



测试结果

[2, 3, 6, 5, 4, 7, 8, 9, 5, 2, 1, 4, 5, 2, 3, 6, 9, 8, 7, 1, 0, 2, 3, 6, 45, 4, 5, 6, 5, 8, 5]
||
||
\/
[0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 45]

参考自《算法导论》,如有纰漏感谢指正

标签:归并,right,Java,int,arr,mid,high,low,排序
From: https://www.cnblogs.com/Alee-ZMZ/p/16749699.html

相关文章

  • 力扣532(java)-数组中的 k-diff 数对(中等)
    题目:给你一个整数数组 nums和一个整数 k,请你在数组中找出不同的 k-diff数对,并返回不同的k-diff数对的数目。k-diff 数对定义为一个整数对(nums[i],nums[j])......
  • Java遍历文件夹
    Java遍历文件夹简单写了一个打印目录下所有文件以及文件夹的代码,类比于树的遍历,写了深度优先和广度优先的遍历。并且还写了个JDK1.7接口提供的的版本。深度广度遍历都用......
  • 9月30Java类与对象中动手动脑
    类与对象定义了一组大体相似的对象。一个类所包含的方法和数据描述一组对象的共同行为和属性对象则是类的具体化,是类的实例。类通过派生类可以有子类,同样也可以有父类,形......
  • java学习之:类和对象、语句块、方法、递归结构!
    语句块和方法语句块语句块确定了局部变量的作用域。语句块嵌套,但是不能在两个嵌套的块内声明同名的变量。语句块可以使用语句块外的变量,语句块中定义的变量作用域只限于语句......
  • javascript>=和<=
    一个条件都不满足为false,至少满足一个条件为truevara=10console.log(a>10);//false;console.log(a<10);//false;console.log(a==10);//trueconsole.log(a>=10);//true1......
  • 【Java】01基础-05 方法
    1.方法概述1.1方法的概念方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集注意:方法必须先创建才可以使用,该过程成为方法定义方法创建后并不......
  • 【Java】01基础-04数组
    1.数组1.1数组介绍数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。1.2数组的定义格式1.2.1第一种格式数据类型[]数组名示例:int[]arr;double[]......
  • Java设计模式 —— 原型模式
    7原型模式7.1原型模式概述PrototypePattern:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。原型模式的工作原理:将一个原型对象传给创建......
  • 试验:Java字段初始化的规律
    packagetest2;publicclassInitializeBlockDemo{ /** *@paramargs */ publicstaticvoidmain(String[]args){ InitializeBlockClassobj=newIni......
  • Java方法详解
    JAVA方法详解Symtem.out.println()类对象方法JAVA方法是语句的集合,它们在一起执行一个功能方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在......