目录
归并排序的思想
代码实现
思路
代码
归并排序的特点
归并排序的思想
归并排序的核心思想是分治,分而治之,就是把数组先分成若干个子数组,先将这些子数组排序后,再合并到一起去。
我们常说的归并排序是二路归并排序,其方法是先将数组分为包含不超过两个元素的若干,子数组排序,然后每两个子数组进行合并,由于此时的子数组是有序的,该问题即有序数组的合并。然后继续两两合并,直到只有一个数组。
代码实现
思路
对于一个数组,设起点为l,终点为r。我们先找中点mid,先将[l,mid]排序,再将[mid+1,r]进行排序,最后将两个数组合并即可。我们可以发现排序里面还有排序,所以这是一个递归问题。
既然是递归,我们肯定要先设置出口,当要排序的数组长度小于等于2时,就可以return了,具体请看代码。
注意,我们分成[l,mid]和[mid+1,r]时,有同学担心mid+1会不会越界,其实是不会的,因为我们在执行mid=(l+r)/2的前提是r-l>=2,所以mid一定小于r,mid+1一定不超过r,所以不存在越界问题。
代码
package algorithm.sort;
public class MergeSort {
public static void main(String[] args) {
int[] nums = new int[]{2,4,6,83,4,62,2,1};
//调用归并排序
mergeSort(nums,0,nums.length-1);
//输出打印结果
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
//归并排序
public static void mergeSort(int[] nums,int l,int r) {
if(r-l==0){
return;
}else if(r-l==1){
if(nums[l]>nums[r]){
int tempInt=nums[l];
nums[l]=nums[r];
nums[r]=tempInt;
}
return;
}
//先排序
int mid=(l+r)/2;
mergeSort(nums,l,mid);
mergeSort(nums,mid+1,r);
//再合并(本质就是有序数组的合并)
int[] temp=new int[r-l+1];
int i=l,j=mid+1;
int p=0;
while(i<=mid && j<=r) {
if (nums[i] <= nums[j]) {
temp[p++] = nums[i++];
} else {
temp[p++] = nums[j++];
}
}
while(i<=mid) {
temp[p++] = nums[i++];
}
while(j<=r) {
temp[p++] = nums[j++];
}
for (i = 0; i <p ; i++) {
nums[l+i]=temp[i];
}
}
}
归并排序的特点
1. 归并排序是一种稳定排序。
2. 时间复杂度为O(nlogn),最坏也是O(nlogn)