算法:归并排序

算法:归并排序

归并排序

归并操作

  归并排序也是一种高级排序算法,它的主要操作就是归并。归并是什么意思呢?

归并操作(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;
    }

}

  

 参考资料

  • 《维基百科》
posted @ 2016-12-04 22:07  子烁爱学习  阅读(747)  评论(0编辑  收藏  举报