合并排序 Java 示例

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(371)   2023-06-26 07:54:18

在计算机科学中,合并排序(通常也拼写为 mergesort)是一种基于O(n log n) 比较的排序算法。大多数实现会生成一个稳定排序,这意味着该实现保留了排序输出中相等元素的输入顺序。 归并排序是一种分而治之的算法。分而治之算法将原始数据分成更小的数据集来解决问题。

在 Mergesort 过程中,集合中的对象被分成两个集合。为了拆分一个集合,Mergesort 将取集合的中间部分并将集合拆分为左右两部分。生成的集合再次通过 Mergesort 算法递归拆分,直到它们被分解为每个集合中的单个元素。

拆分每个集合后,mergesort 算法开始合并通过上述过程获得的所有集合。要合并两个集合,Mergesort 从每个集合的开头开始。它选择较小的对象并将该对象插入到新集合中。对于这个集合,它现在选择下一个元素,并通过一次比较每个集合中的一个元素来从两个集合中选择较小的元素。

此过程创建已排序元素的集合(需要排序的所有元素的子集)。这个过程是针对第一步获得的所有可用集合递归完成的,即拆分集合。

一旦两个集合中的所有元素都被插入到新集合中,Mergesort 就成功地对集合进行了排序。

为了避免创建过多的集合,通常只创建一个新集合,并将新集合和现有集合视为不同的集合。

为了更好地理解,请查看遵循上述方法的下图。

合并排序算法

归并排序算法

从概念上讲,合并排序以递归方式按如下方式工作:

  1. 将未排序的列表分成两个大约一半大小的子列表
  2. 对两个子列表中的每一个进行排序
  3. 将两个已排序的子列表合并回一个已排序的列表

合并排序示例

在下面的示例中,我们以表达方式实现了归并排序算法,以使其更易于理解。按照下面给定的合并排序代码中每个步骤/语句上方的注释进行操作。

import java.util.*;

public class MergerSort 
{
	public static void main(String[] args) 
	{
		//Unsorted array
		Integer[] a = { 2, 6, 3, 5, 1 };
		
		//Call merge sort
		mergeSort(a);
		
		//Check the output which is sorted array
		System.out.println(Arrays.toString(a));
	}

	@SuppressWarnings("rawtypes") 
	public static Comparable[] mergeSort(Comparable[] list) 
	{
		//If list is empty; no need to do anything
        if (list.length <= 1) {
            return list;
        }
        
        //Split the array in half in two parts
        Comparable[] first = new Comparable[list.length / 2];
        Comparable[] second = new Comparable[list.length - first.length];
        System.arraycopy(list, 0, first, 0, first.length);
        System.arraycopy(list, first.length, second, 0, second.length);
        
        //Sort each half recursively
        mergeSort(first);
        mergeSort(second);
        
        //Merge both halves together, overwriting to original array
        merge(first, second, list);
        return list;
    }
    
	@SuppressWarnings({ "rawtypes", "unchecked" }) 
    private static void merge(Comparable[] first, Comparable[] second, Comparable[] result) 
	{
        //Index Position in first array - starting with first element
        int iFirst = 0;
        
        //Index Position in second array - starting with first element
        int iSecond = 0;
        
        //Index Position in merged array - starting with first position
        int iMerged = 0;
        
        //Compare elements at iFirst and iSecond, 
        //and move smaller element at iMerged
        while (iFirst < first.length && iSecond < second.length) 
        {
            if (first[iFirst].compareTo(second[iSecond]) < 0) 
            {
                result[iMerged] = first[iFirst];
                iFirst++;
            } 
            else 
            {
                result[iMerged] = second[iSecond];
                iSecond++;
            }
            iMerged++;
        }
        //copy remaining elements from both halves - each half will have already sorted elements
        System.arraycopy(first, iFirst, result, iMerged, first.length - iFirst);
        System.arraycopy(second, iSecond, result, iMerged, second.length - iSecond);
    }
}
Output:

Input Array :  [ 2, 6, 3, 5, 1, 1, 8 ]
Output Array : [ 1, 1, 2, 3, 5, 6, 8 ]

Input Array :  [ 12, 16, 333, 50, 1000, 5, 897, 1, 3, 66, 13 ]
Output Array : [ 1, 3, 5, 12, 13, 16, 50, 66, 333, 897, 1000 ]

何时使用归并排序

  1. 归并排序在数据结构不支持随机访问时使用,因为它适用于纯顺序访问(前向迭代器,而不是随机访问迭代器)。它还广泛用于外部排序,与顺序访问相比,随机访问可能非常非常昂贵。

    例如,当对不适合内存的文件进行排序时,您可以将其分解为适合内存的块,独立使用这些块进行排序,将每个文件写入一个文件,然后对生成的文件进行合并排序。

    p>
  2. 此外,当您需要稳定排序时,您可以使用归并排序。这是归并排序的一个非常重要的特征。
  3. 在处理链表时合并排序更快。这是因为在合并列表时可以很容易地更改指针。它只需要通过列表一次 (O(n))。
  4. 如果发生大量并行化,那么并行化 Mergesort 比其他排序算法更简单。

这就是关于合并排序 Java 教程的全部内容。在下面的评论部分中将您的问题/疑问告诉我。

快乐学习!!

地址:https://www.cundage.com/article/merge-sort-java-example.html

相关阅读

插入排序 是一种简单而缓慢的排序算法,它反复从未排序的部分中取出下一个元素,并将其插入到已排序部分的正确位置。 插入排序的思想来源于我们的日常生活经验。例如,当你和朋友一起玩牌时,你会把你挑选的...
冒泡排序是一种简单而缓慢的排序算法,它重复遍历集合,比较每对相邻元素,如果顺序错误则交换它们。在排序算法中,如果我们观察阶数较高(即值较大)的元素的移动,它们就像水中的气泡,从底部慢慢地漂浮到顶...
在计算机科学中,合并排序(通常也拼写为 mergesort)是一种基于O(n log n) 比较的排序算法。大多数实现会生成一个稳定排序,这意味着该实现保留了排序输出中相等元素的输入顺序。 归并...
按字母顺序对 String 的字符进行排序 的 Java 示例 – 使用 Stream.sorted() 和 Arrays.sort() 方法。 1) 使用 Stream API 对字符串进行排...
通过一些示例了解如何使用 Collections.sort() 方法对对象列表进行排序。 默认情况下,sort() 方法将给定列表按升序(或自然顺序)排序。我们可以使用 Collections....
在 Comparable 和 Comparator 接口、数组.sort() 和 Stream.sorted() API。 我们将学习按自然顺序、逆序和任何其他自定义顺序对数组进行排序。 1. ...
这是一个非常常见的面试问题。你被问到,如果你有一个只能在一个方向上遍历的链表,并且如果该链表中有一个循环,你将如何检测它? 好吧,如果您不知道答案,请不要沮丧。我个人的看法是,这类问题并不能评估...
Picocli 2.0 添加了对其他 JVM 语言的改进支持,尤其是 Groovy。当 Groovy 语言通过 CliBuilder 类提供内置 CLI 支持时,为什么还要使用 picocli?
校验和哈希是对用户提供的内容应用特定算法和操作后获得的加密字符序列。在本 Java 散列教程中,我们将学习为文件生成校验和散列。 1. 为什么我们可能要为文件生成哈希? 任何严肃的文件提供商都提...
Spring Boot Data JPA 排序教程展示了如何在 Spring Data JPA 中对查询结果进行排序。查询结果使用 ORDER BY 子句或 Sort 对象进行排序。 春天 是一...