归并排序Merge_Sort

归并排序的基本思想是指递归的将待排序数组分为两组,直到无法再分,停止条件中间数m等于左边界或者右边界。如下图所示:

 

 

分完之后进行合并,如果两个合并的部分均只有1个元素,那么直接进行比较后交换即可。

如果每个部分拥有多个数据,则进行合并。以{4,6}和{8}合并为例:

 

 先申请一个等长的数组,第一轮各有一个指针指向4和8,选择一个更小的数据填充到新数组中。指针向前移一位,直到两个指针均遍历完所有的数据。

               

 

红色的箭头表示本部分已经遍历完毕。

 

 

 

时间复杂度分析:O(NlogN)

代码:

package Sort;

public class Merge_Sort {
    public static void main(String [] args)
    {
        int [] a = {6,4,8,9,3,1,2,7,5};
        merge(a,0,a.length - 1);
        for(int y:a)
            System.out.print(y);
    }

    static void merge(int [] a, int i, int j)
    {
        int m = ((i + j) / 2);
        if(m == i || m == j)
        {
            if(a[i] > a[j])
            {
                int t = a[j];
                a[j] = a[i];
                a[i] = t;
            }
        }

        else
        {
            merge(a,i,m);
            merge(a,m+1,j);

            int [] b = new int [j - i + 1];
            int l = i,k = m + 1,o=0;
            while (l <= m || k <= j)
            {
                if (l <= m && k <= j) {
                    if (a[l] < a[k]) {
                        b[o] = a[l];
                        o++;
                        l++;
                    } else {
                        b[o] = a[k];
                        o++;
                        k++;
                    }
                }
                else if(l > m && k <= j)
                {
                    b[o] = a[k];
                    k++;
                    o++;
                }
                else
                {
                    b[o] = a[l];
                    l++;
                    o++;

                }

            }

            for (int x = 0; x < b.length; x++)
            {
                a[i] = b[x];
                i++;
            }

        }

    }

}

 

 

 

posted @ 2019-11-24 23:33  LeftBody  阅读(207)  评论(0编辑  收藏  举报