十大排序之Merge Sort 归并排序

简介: 十大排序之Merge Sort 归并排序

Merge Sort 归并排序

归并排序(Merge Sort)是一种常用的排序算法,其思路如下:

  1. 将待排序数组分成两个子数组,分别对两个子数组进行递归排序。
  2. 将两个已排序的子数组合并成一个有序数组。

以下是归并排序的具体步骤:

  1. 将待排序数组从中间分成两个子数组。
  2. 递归地对左右两个子数组进行归并排序。
  3. 将两个已排序的子数组合并成一个有序数组。

以下是归并排序的示例代码:

public class Sort {
    public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(arr, left, mid); // 对左子数组进行递归排序
            mergeSort(arr, mid + 1, right); // 对右子数组进行递归排序
            merge(arr, left, mid, right); // 合并两个已排序的子数组
        }
    }
    private static void merge(int[] arr, int left, int mid, int right) {
        int n1 = mid - left + 1;
        int n2 = right - mid;
        int[] leftArr = new int[n1];
        int[] rightArr = new int[n2];
        for (int i = 0; i < n1; i++) {
            leftArr[i] = arr[left + i];
        }
        for (int j = 0; j < n2; j++) {
            rightArr[j] = arr[mid + 1 + j];
        }
        int i = 0;
        int j = 0;
        int k = left;
        while (i < n1 && j < n2) {
            if (leftArr[i] <= rightArr[j]) {
                arr[k] = leftArr[i];
                i++;
            } else {
                arr[k] = rightArr[j];
                j++;
            }
            k++;
        }
        while (i < n1) {
            arr[k] = leftArr[i];
            i++;
            k++;
        }
        while (j < n2) {
            arr[k] = rightArr[j];
            j++;
            k++;
        }
    }
    public static void main(String[] args) {
        int[] array = {5, 2, 8, 12, 1, 6};
        mergeSort(array);
        System.out.println("排序结果:");
        for (int num : array) {
            System.out.print(num + " ");
        }
    }
}

归并排序的时间复杂度始终为O(n log n),无论是最好情况、最坏情况还是平均情况下。

归并排序的空间复杂度为O(n),因为需要使用额外的空间来存储临时数组。

归并排序是一种稳定的排序算法,适用于各种数据规模。

相关文章
|
6月前
|
存储
归并排序 merge_sort
归并排序 merge_sort
28 0
|
6月前
|
搜索推荐 算法 Java
sort-03-SelectSort 选择排序算法详解
这是一个关于排序算法的系列文章摘要,包括了各种排序算法的介绍和Java实现。文章列举了冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序的链接和简要说明。其中,选择排序算法被详细解释,它是通过找到未排序序列中的最小元素并将其放到正确位置来逐步构建有序序列的。Java实现中,选择排序的`doSort`方法通过两层循环实现,时间复杂度为`O(N^2)`,是稳定的排序算法。整个排序项目已开源在GitHub。
|
6月前
|
搜索推荐 算法 Java
sort-05-insert sort 插入排序算法详解
这是一个关于排序算法的系列文章总结,包括冒泡排序、快速排序、选择排序、堆排序、插入排序等10种排序算法的详细讲解和Java实现。插入排序是一种简单直观的排序算法,通过构建有序序列并逐个插入新元素来排序。提供的Java代码展示了插入排序的实现过程,并附有测试示例。所有算法已开源在GitHub项目[https://github.com/houbb/sort](https://github.com/houbb/sort)中。
|
6月前
|
搜索推荐 算法 Java
sort-07-merge sort 归并排序
这是一个关于排序算法的系列文章摘要。文章涵盖了多种排序算法的详细解释,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。归并排序是一种效率为O(nlogn)的排序算法,基于分治法,将序列分成两半,分别排序后再合并。文章提供了Java实现的递归和迭代版本。在归并排序的递归实现中,代码通过不断拆分和合并子序列完成排序,而迭代实现则是通过逐步增大子序列长度并进行两两归并来排序。整个系列可在GitHub找到相关源码。
|
6月前
|
搜索推荐 算法
Sort-00-十大排序算法汇总
这是一个关于排序算法的系列文章总结,包括冒泡、选择、插入、归并、快速、堆、希尔、计数、桶和基数排序的详细讲解。十大排序算法各有特点,如冒泡排序适合小规模或基本有序的数据,快速排序在大规模随机数据中表现优秀。时间复杂度和空间复杂度各不相同,选择时需根据数据特性与应用场景权衡。
|
6月前
|
搜索推荐 C++ 索引
常闲排序算法-merge讲解
常闲排序算法-merge讲解
20 1
|
6月前
|
机器学习/深度学习 算法 搜索推荐
DS:八大排序之归并排序、计数排序
DS:八大排序之归并排序、计数排序
|
6月前
|
搜索推荐 C++ 索引
常闲排序算法merge讲解
常闲排序算法merge讲解
55 0
|
存储 搜索推荐
十大排序之Quick Sort 快速排序
十大排序之Quick Sort 快速排序
|
搜索推荐 算法 数据可视化
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
112 0
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)