Java单链表归并排序

简介: 概念 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。 归并排序基本原理 通过对若干个有序结点序列的归并来实现排序。 所谓归并是指将若干个已排好序的部分合并成一个有序的部分。 单链表实现归并排序 找到中间点拆分链表 //找到中间点,然后分割
+关注继续查看

概念

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

归并排序基本原理

通过对若干个有序结点序列的归并来实现排序。
所谓归并是指将若干个已排好序的部分合并成一个有序的部分。

这里写图片描述

单链表实现归并排序

找到中间点拆分链表

//找到中间点,然后分割
    public ListNode getMiddle(ListNode head) {
        if (head == null) {
            return head;
        }
        //快慢指针
        ListNode slow, fast;
        slow = fast = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

合并排好序的链表

// 合并排好序的链表
    public ListNode merge(ListNode a, ListNode b) {
        ListNode dummyHead, curr;
        dummyHead = new ListNode(0);
        curr = dummyHead;
        while (a != null && b != null) {
            if (a.val <= b.val) {
                curr.next = a;
                a = a.next;
            } else {
                curr.next = b;
                b = b.next;
            }
            curr = curr.next;
        }
        curr.next = (a == null) ? b : a;
        return dummyHead.next;
    }

单链表的归并排序

//单链表的归并排序
    public ListNode merge_sort(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        //得到链表中间的数
        ListNode middle = getMiddle(head);
        ListNode sHalf = middle.next;
        //拆分链表
        middle.next = null;
        //递归调用
        return merge(merge_sort(head), merge_sort(sHalf));
    }

Application.java

public static void main(String[] args) {
        ListNode head = new ListNode(0);
        ListNode l1 = new ListNode(2);
        ListNode l2 = new ListNode(5);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(8);
        ListNode l5 = new ListNode(4);
        ListNode l6 = new ListNode(2);
        ListNode l7 = new ListNode(1);

        head.next = l1;
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = l7;
        l7.next = null;

        ListNode p = head;
        while (p.next != null) {
            System.out.print(p.val);
            p = p.next;
        }
        System.out.print(p.val);
        System.out.println();

        new MergeSort().merge_sort(head);

        p = head;
        while (p != null) {
            System.out.print(p.val);
            p = p.next;
        }
    }

执行效果图

这里写图片描述

目录
相关文章
|
1月前
|
算法 Java
java实现归并排序
java实现归并排序
23 0
|
2月前
|
搜索推荐 算法 Java
【算法】归并排序的原理与Java实现
归并排序(Merge Sort)是一种经典的排序算法,基于分治(Divide and Conquer)策略。它将待排序的数组划分为多个子数组,然后分别对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。归并排序的核心思想是将问题分解为更小的子问题,解决子问题后再将结果合并得到最终的解决方案。
40 0
|
7月前
|
算法 Java
归并排序+java基础数组。、
归并排序+java基础数组。、
42 0
归并排序+java基础数组。、
|
8月前
|
Java
Java实现归并排序
Java实现归并排序
67 0
Java实现归并排序
|
8月前
|
Java
Java代码实现归并排序
#### 归并排序(Merge Sort) 思路:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 所以说归并排序的核心思想是排序和合并两个有序数组,这个规程需要用递归来实现。 核心思想: * 将数组拆分为两个数组,然后对两个数组各自进行排序。 * 合并两个排好序的数组。
|
9月前
|
搜索推荐 Java
Java归并排序
归并排序 1、原理 归并排序是一种概念上最简单的排序算法,与快速排序一样,归并排序也是基于分治法的。归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。合并两个子序列的过程也就是两路归并。 2、复杂度 归并排序是一种稳定的排序算法,归并排序的主要问题在于它需要一个与待排序数组一样大的辅助数组空间。由于归并排序每次划分时两个子序列的长度基本一样,所以归并排序最好、最差和平均时间复杂度都是nlog2n。
69 0
|
9月前
|
Java
Java实现归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法
110 0
|
11月前
|
Java
杭电6318(归并排序)逆序数(java)
归并排序是采用分冶实现的,其核心思想就是分冶得到两边经过递归是有序的,(因为分到最后就是两个元素的比较。
46 0
|
11月前
|
算法 Java 索引
归并排序java(内附超详解图文讲解)
归并排序介绍: 归并排序图解: 示意图1 示意图2 归并排序详细步骤: 1.组合 2.分组 完整代码
归并排序java(内附超详解图文讲解)
|
11月前
|
算法 搜索推荐 Java
【算法篇】/*简单直观理解归并排序*/(JAVA语言实现)
【算法篇】/*简单直观理解归并排序*/(JAVA语言实现)
56 0
【算法篇】/*简单直观理解归并排序*/(JAVA语言实现)
相关产品
机器翻译
推荐文章
更多