算法复习-归并排序(递归实现)

一.在实现归并排序之前首先了解递归过程:

       递归过程简单来说就是在函数中自己调用自己。但是,在函数体中一定需要一个结束过程,对应函数体最不停调用自己的过程中何时终止。总的来说,递归的过程一般是缩小问题规模,靠近结束过程。在递归的过程中,会利用栈结构。每次函数执行过程中调用新的函数都会保存运行现场(包括局部变量和当前代码行等等),最外层的函数调用最早被压入栈中,也就是栈底,而最晚被调用的也就最早弹出,然后依次回调。

首先了解归并排序的基本过程:

    归并排序将整个数列分解为多个子数列,将各个子数列在合并的过程中进行排序。e.g 现有数列{9,8,7,10,0,2,1,4}。

    1.首先将数列分为左右两个子数列{9,8,7,10}和{0,2,1,4}

     2.左子数列继续分解为{9,8}和{7,10},同时右子数列也分解为{0,2}和{1,4}。

     3.{9,8}继续分解为{9},{8},其余数列同样。

     4.{9}和{8}都都仅包含单个数,无需排列。

     5.合并{9}和{8},8<9,所以合并后为{8,9},同时{7}和{10},也合并为{7,10},({0,2},{1,4}也是如此)。

     6.{8,9}和{7,10}开始合并。现有指针left指向8,right指针指向7,和temp数组。比较8和7,7<8,所以temp[0]=7,right指针右移,指向10。

     7.比较8和10,8<10,所以temp[1]=8,left指针右移,指向9。

     8.比较,9和10, temp[2]=9,left指针右移,指向数组末尾。

     9.right指针还没到末尾,temp[3]=10,right指针右移,指向末尾。

     10.其余部分也是如此。

     代码如下:

/***
 * Authot:Spike Wang
 * date:2018-6-26
 */
public class mergeSort {
    public  static int[] sort(int[] array,int l,int r)
    {
        if (array.length==2&&array==null)
        {
            return array;
        }
        if (l<r) {
            int mid = (l + r)/ 2;              //防止Out of Bounds

            sort(array, l, mid);
            sort(array,mid+1, r);
            merge(array,l,mid,r );
        }
         return array;
    }
    public static void merge(int[] array,int l,int mid,int r)
    {
        int temp[]=new int[r-l+1];
        int i=l;
        int j=mid+1;
        int num=0;
        while (i<=mid&&j<=r)
        {
            if (array[i]<=array[j])
            temp[num++]=array[i++];
            else
                temp[num++]=array[j++];
        }
        while (i<=l)
        {
            temp[num++]=array[i++];
        }
        while (j<=r)
        {
            temp[num++]=array[j++];
        }
        for (int x=0;x<temp.length;x++)
        {
            array[x+l]=temp[x];
        }

    }

猜你喜欢

转载自blog.csdn.net/qq_34814105/article/details/80821252