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

来源:互联网 发布:淘宝特卖女装连衣裙 编辑:程序博客网 时间:2024/05/17 12:56

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


原理:归并排序是分治法-分而治之最经典的表达。
最基本的思想就是将两个有序的序列合并为一个有序序列。
把一个长度为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));    }}
0 0