归并排序(Merge Sort)是一种常见的基于比较的排序算法,它的主要思想是分而治之(Divide and Conquer)。它的核心思想是将一个大的问题分解为小的子问题,解决子问题,然后将它们合并(merge)以获得最终的解决方案。
以下是归并排序的详细步骤:
-
分割(Divide):将原始数组划分为两个或更多的子数组。这个过程持续递归,直到每个子数组都只包含一个元素,即认为这些子数组都是有序的。
-
合并(Merge):将两个有序的子数组合并成一个有序的大数组。合并过程是排序的关键步骤。在合并过程中,我们逐个比较两个子数组中的元素,将较小的元素放入新的数组,重复这个过程,直到将两个子数组全部合并为一个有序数组。
-
递归:递归是归并排序的核心。每次分割和合并过程都会递归地调用归并排序,直到整个数组都被排序。
-
结果:最终,当递归结束时,整个数组就会被完全排序。
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)。这使得它在处理大规模数据时非常高效。
归并排序的优点包括:
- 稳定性:相同元素的相对位置在排序前后不会改变,这在某些应用中是非常重要的。
- 适用于大数据集:归并排序的时间复杂度相对较低,因此适用于大规模数据集的排序。
- 可以用于外部排序:归并排序可以轻松地应用于需要外部存储的排序任务。
然而,归并排序的缺点是它需要额外的空间来存储中间结果,因此在内存有限的情况下可能不适用。此外,由于它是基于比较的排序算法,对于小规模数据集来说可能不如一些快速排序算法快速。