Java实现归并排序

博客主要介绍归并算法思想,即先将数组递归分组再合并结果。还给出了 Java 实现数组和链表归并算法的相关内容,最后提供了完整代码的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并算法的思想

先将数组递归分组,然后合并结果,换成伪码可表示为

MergeSort(origin) = MergeSort(MergeSort(left), MergeSort(right))

链表的归并排序代码结构更加贴合上述伪码

Java 数组归并算法实现

package com.study;

import java.util.Arrays;

public class MergeSort {

    public static void main(String[] args){
        int[] origin = {1,9,10,15,2,8,4,45};
        MergeSort mergeSort = new MergeSort();
        Arrays.stream(mergeSort.sort(origin, 0, origin.length - 1))
                .forEach(System.out :: println);
    }


    public int[] sort(int[] origin, int low, int high){
        int middle = (low + high) / 2;
        if (low < high) {
            sort(origin, low, middle);
            sort(origin, middle+1, high);
            merge(origin, low, middle, high);
        }
        return origin;
    }

    private void merge(int[] origin, int low, int mid, int high){
        int[] temp = new int[high - low + 1];
        int i = low;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= high) {
            if (origin[i] <= origin[j]) {
                temp[k++] = origin[i++];
            } else {
                temp[k++] = origin[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = origin[i++];
         }
        while (j <= high) {
            temp[k++] = origin[j++];
        }
        for (int x=0; x<temp.length; x++) {
            origin[x + low] = temp[x];
        }
    }
}

Java 链表归并算法实现

package com.study;

import java.util.Objects;

public class LinkedMergeSort {

    public static void main(String[] args){
        ListNode head = new ListNode(3);
        ListNode node2 = new ListNode(10);
        ListNode node3 = new ListNode(4);
        ListNode node4 = new ListNode(5);
        head.next = node2;
        node2.next = node3;
        node3.next = node4;
        LinkedMergeSort linkedMergeSort = new LinkedMergeSort();
        ListNode result = linkedMergeSort.sort(head);
        while (!Objects.isNull(result)) {
            System.out.println(result.val);
            result = result.next;
        }
    }


    public ListNode sort(ListNode head){
        if (Objects.isNull(head)) {
            return head;
        }
        ListNode middle = getMiddle(head);
        ListNode right = middle.next;
        middle.next = null;
        return merge(head, right);
    }

    private ListNode getMiddle(ListNode head){
        ListNode slow = head;
        ListNode fast = head.next;
        while (!Objects.isNull(fast) && !Objects.isNull(fast.next)) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    private ListNode merge(ListNode left, ListNode right){
        if (Objects.isNull(left)) {
            return right;
        }
        if (Objects.isNull(right)) {
            return left;
        }
        ListNode head;
        if (left.val <= right.val) {
            head = left;
            head.next = merge(left.next, right);
        } else {
            head = right;
            head.next = merge(left, right.next);
        }
        return head;
    }

}

class ListNode {
    int val;
    ListNode next;
    ListNode(int val){
        this.val = val;
    }
}

完整代码地址:https://github.com/BoyQiang/personal-code-learning/tree/master/personal-code-learning-algorithm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值