算法:归并排序
算法:归并排序
归并排序
归并操作
归并排序也是一种高级排序算法,它的主要操作就是归并。归并是什么意思呢?
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
举个简单例子,我们之前有讲合并有序链表或是数组,这就是一种归并,简单理解就是将两个有序序列进行合并!
那这样说来,归并操作的代码别说你并不会☺️!
谈到排序
谈到排序,说明给定的序列肯定并不是有序的,我们要做的就是将它有序化。如果我们直接将一个无序序列中间腰斩,他就会有两个序列了,
但此时来说,左右序列都是无序的,是没办法进行归并操作,那我们接着对左右两边再腰斩!
直到左右两个序列长度为1,此时就是有序的!别问我为什么,长度为1 当然是有序啦!这个时候就可以进行归并操作了!
归并后就组成了长度为2的有序序列,根基现在是有序的,那我们按照之前划分的顺序逆向归并,就组成了一个有序数组!
这就是归并操作的完整流程了,此时就可以按照思路写代码了!
Java实现
代码是我纯手撸的,可能并不是最优解,但是我觉得思路搞懂了,写个代码还是简单的!
package sort; import java.util.Arrays; /** * 归并排序 * @author mrsaber */ public class MergeSort { public static void main(String[] args) { System.out.println(Arrays.toString(new MergeSort().sort(new int[]{1,5,3,2,4,8,9,2,1}))); } public int[] sort(int[] nums){ if(nums.length==1) return nums; int mid = nums.length/2; int[] leftNums = sort(Arrays.copyOfRange(nums,0,mid)); int[] rightNums =sort(Arrays.copyOfRange(nums,mid,nums.length)); return merge(leftNums,rightNums); } /** * 合并操作 * @param leftNums * @param rightNums */ public int[] merge(int[] leftNums,int[] rightNums){ int[] result = new int[leftNums.length+rightNums.length]; int i=0,j=0,p=0; while (i<leftNums.length&&j<rightNums.length){ if(leftNums[i]<rightNums[j]){ result[p] = leftNums[i]; i++; }else{ result[p] = rightNums[j]; j++; } p++; } while (i<leftNums.length) result[p++]=leftNums[i++]; while (j<rightNums.length) result[p++]=rightNums[j++]; return result; } }
参考资料
- 《维基百科》