一步一步搞清排序之归并排序(JAVA)

前言:前面搞定了插入、冒泡、选择···这些磨人的小妖精,这一次的目标是搞定归并排序~归并排序这个东东呢,算法考试中有遇到过,当时并不能完整无误的写出来,学渣属性曝光~~


原理:归并排序是分治法-分而治之最经典的表达。
最基本的思想就是将两个有序的序列合并为一个有序序列。
把一个长度为N的数组,看成N个待合并的序列
第一步做两两合并,得到N/2个有序的序列
接下来两两合并上一步得到的有序序列,得到N/4个有序序列
继续合并···
经过log N 次的归并后,就得到了我们所需要的有序序列~


代码如下:

package zj.com.merge;

import java.util.Arrays;

public class MergeSort {

    public void mergeSort(int[] a,int left,int right){
        if(left<right)
        {
            int mid = (left+right)/2;
            mergeSort(a, left, mid);
            mergeSort(a, mid+1, right);
            merge(a, left, mid, right);
        }
    }

    public void merge(int[] a,int left,int mid,int right){

        /*temp作为临时数组顺序存储元素
         * newindex 作为临时数组的下标指引
         * copyindex 是将该段排序后的元素复制回原数组的指引
         * sepindex 是A、B两个数组后一个数组的第一个元素索引*/
        int[] temp = new int[a.length];
        int newindex = left;
        int copyindex = left;
        int sepindex = mid+1;
        while(left<=mid&&sepindex<=right)
        {
            if(a[left]<=a[sepindex])
            {
                //将较小的一个数放入临时数组中
                temp[newindex] = a[left];
                newindex++;
                left++;
            }
            else
            {
                temp[newindex] = a[sepindex];
                newindex++;
                sepindex++;
            }
        }
        //若A、B数组有一个已经全部放入临时数组,则剩下的不用比较直接放入
            while(left<=mid)
            {
                temp[newindex++] = a[left++];
            }
            while(sepindex<=right)
            {
                temp[newindex++] = a[sepindex++];
            }

            //将临时数组中的元素按顺序复制到原数组
            while(copyindex<=right)
            {
                a[copyindex] = temp[copyindex++];
            }
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MergeSort m = new MergeSort();
        int[] a = {3,2,1,6,5,4,9,8,7,10,12};
        m.mergeSort(a, 0, a.length-1);
        System.out.println(Arrays.toString(a));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值