一.介绍
归并排序(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;
}
}