算法-归并排序-JAVA

下面是Java实现归并排序的示例代码:

java 复制代码
public class MergeSort {
    public void mergeSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        int[] temp = new int[arr.length];
        mergeSort(arr, temp, 0, arr.length - 1);
    }

    private void mergeSort(int[] arr, int[] temp, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = left + (right - left) / 2;
        mergeSort(arr, temp, left, mid);
        mergeSort(arr, temp, mid + 1, right);
        merge(arr, temp, left, mid, right);
    }

    private void merge(int[] arr, int[] temp, int left, int mid, int right) {
        int i = left;
        int j = mid + 1;
        int k = left;
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = arr[i++];
        }
        while (j <= right) {
            temp[k++] = arr[j++];
        }
        for (int index = left; index <= right; index++) {
            arr[index] = temp[index];
        }
    }
}

在归并排序中,首先进行递归地将数组划分为更小的子数组,然后进行合并操作。在合并操作中,将两个有序的子数组合并成一个有序的数组。

上述代码实现了归并排序的主要逻辑。mergeSort方法用于调用归并排序的入口,它接受待排序的数组作为参数,并创建一个额外的临时数组。mergeSort方法会递归地将数组划分为更小的子数组,然后调用merge方法将两个子数组合并。

merge方法中,使用三个指针ijk分别指向左子数组、右子数组和临时数组的位置。通过比较左指针和右指针指向的元素大小,将较小的值复制到临时数组中,并同时移动指针。最后,将临时数组中的元素复制回原始数组中。

要使用归并排序,只需创建一个MergeSort对象,并调用mergeSort方法,示例如下:

java 复制代码
public class Main {
    public static void main(String[] args) {
        int[] arr = {6, 3, 8, 5, 2, 7, 1, 4};
        MergeSort mergeSort = new MergeSort();
        mergeSort.mergeSort(arr);

        System.out.println("Sorted array:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

以上代码将输出归并排序后的有序数组:

java 复制代码
Sorted array:
1 2 3 4 5 6 7 8

归并排序的时间复杂度为O(nlogn),其中n是待排序数组的大小。该算法是一种稳定的排序算法,适用于各种数据类型和数据量的排序。

相关推荐
hsling松子1 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1232 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝2 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O2 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King3 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
ok!ko3 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
代码雕刻家3 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain3 小时前
算法 | 位运算(哈希思想)
算法
2402_857589363 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰4 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin