算法通关村第10关【黄金】| 归并排序

归并排序(Merge Sort)是一种常见的基于比较的排序算法,它的主要思想是分而治之(Divide and Conquer)。它的核心思想是将一个大的问题分解为小的子问题,解决子问题,然后将它们合并(merge)以获得最终的解决方案。

以下是归并排序的详细步骤:

  1. 分割(Divide):将原始数组划分为两个或更多的子数组。这个过程持续递归,直到每个子数组都只包含一个元素,即认为这些子数组都是有序的。

  2. 合并(Merge):将两个有序的子数组合并成一个有序的大数组。合并过程是排序的关键步骤。在合并过程中,我们逐个比较两个子数组中的元素,将较小的元素放入新的数组,重复这个过程,直到将两个子数组全部合并为一个有序数组。

  3. 递归:递归是归并排序的核心。每次分割和合并过程都会递归地调用归并排序,直到整个数组都被排序。

  4. 结果:最终,当递归结束时,整个数组就会被完全排序。

算法通关村第10关【黄金】| 归并排序_第1张图片

 

class Solution {
    public int[] sortArray(int[] nums) {
        if(nums == null || nums.length == 1){
            return nums;
        }
        sort(nums,0,nums.length - 1);
        return nums;
    }

    public void sort(int[] nums,int start,int end){
        if(start == end){
            return;
        }
        sort(nums,start,(start+end)/2);
        sort(nums,(start+end)/2+1,end);
        merge(nums,start,end);
    }

    public void merge(int[] nums,int start,int end){
        int mid = (start + end)/2;
        int[] temp = new int[end - start + 1];
        int k = 0;
        int i = start;
        int j = mid + 1;
        while(i <= mid&&j <= end){
            if(nums[i]<=nums[j]){
                temp[k++] = nums[i++];
            }else{
                temp[k++] = nums[j++];
            }
        }
        while(i<=mid){
            temp[k++] = nums[i++];
        }
        while(j<=end){
            temp[k++] = nums[j++];
        }
        k=0;
        while(start<=end){
            nums[start++] = temp[k++];
        }
    }
}

归并排序的时间复杂度是稳定的,它保证在最坏、平均和最好的情况下都是O(n log n)。这使得它在处理大规模数据时非常高效。

归并排序的优点包括:

  • 稳定性:相同元素的相对位置在排序前后不会改变,这在某些应用中是非常重要的。
  • 适用于大数据集:归并排序的时间复杂度相对较低,因此适用于大规模数据集的排序。
  • 可以用于外部排序:归并排序可以轻松地应用于需要外部存储的排序任务。

然而,归并排序的缺点是它需要额外的空间来存储中间结果,因此在内存有限的情况下可能不适用。此外,由于它是基于比较的排序算法,对于小规模数据集来说可能不如一些快速排序算法快速。

你可能感兴趣的:(算法,算法,排序算法,数据结构)