归并排序 merge sort

一.介绍

       归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序的数组分成两部分,分别对这两部分递归地进行排序,最后将两个有序子数组合并成一个有序数组。它的时间复杂度为 O(nlogn)。

归并排序的基本思路是将待排序的数组分成两个部分,分别对这两部分进行排序,然后将排好序的两部分合并成一个有序数组。这个过程可以用递归来实现。具体的实现步骤如下:

    1.分解:将待排序的数组不断分成两个子数组,直到每个子数组只有一个元素为止。

    2.合并:不断将相邻的两个子数组合并成一个有序数组,直到最后只剩下一个有序数组为止,归并排序结束。

优缺点:

归并排序的优点是稳定性好,即对于相等的元素,在排序前后它们的相对位置不会改变。缺点是需要额外的空间来存储辅助数组。

二.原理

归并排序展开后像一个二叉树。

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode dummy = new ListNode(-1);//辅助节点
        dummy.next = head;
        ListNode fast=dummy,slow=dummy;
        while(fast != null && fast.next != null)//快慢指针寻找中心点
        {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode mid = slow.next;
        slow.next = null;
        return mergeList(sortList(head),sortList(mid));//递归

    }

    public ListNode mergeList(ListNode list1, ListNode list2)//合并并排序
    {
        ListNode dummy = new ListNode(0),p=dummy;
        while(list1 != null && list2 != null)
        {
            if(list1.val < list2.val)
            {
                p.next=list1;
                list1=list1.next;
            }else
            {
                p.next=list2;
                list2=list2.next;
            }
            p = p.next;
        }
        p.next=(list1 != null) ? list1 : list2 ;
        return  dummy.next;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值