码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法之归并算法

时间:2015-04-11 23:57:20      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

/*
    本例拟在实现排序算法的归并算法,归并算法遵循分治法的思想
    归并算法:
    归并算法主要用来合并两个已经排好序的序列。用Merge(A,p,q,r)来实现合并,
    其中A代表数组,A[p,q]和A[q+1,r]A的两个子数组,且两个数组都已经排好序,归并算法
    就是将这两个子数组合并成一个排好序的数组并替代当前的数组A[p,r]。
*/
public class Merge
{
    public static void main(String[] args)
    {
        int[] a = {1,2,3,4,5,7,9,11,6,8,10,12,13,14,15,16};
        merge(a,4,7,11);
        for(int i=0; i<a.length; i++)
        {
            System.out.print(a[i]);
        }
    }

    public static int[] merge(int[] a, int leftStart, int leftEnd, int rightEnd)
    {
        int left_length = leftEnd - leftStart + 1; //左数组的长度
        int right_length = rightEnd - leftEnd; //右数组的长度

        int[] left = new int[left_length + 1];  //构建左数组的副本,长度加1,用来存放标志牌
        int[] right = new int[right_length + 1]; //构建右数组的副本,长度加1,用来存放标志牌

        for(int i=0; i<left_length; i++)
        {
            left[i] = a[leftStart + i];    //往左数组的副本里拷贝数据
        }
        for(int i=0; i<right_length; i++)
        {
            right[i] = a[leftEnd + i + 1];  //往右数组的副本里拷贝数据
        }

        left[left_length ] = 10000;          //左数组最后一个数放一个大数,用作结束的标志
        right[right_length ] = 10000;        //右数组的最后一个数放一个大数,用作结束的标志

        int i=0;    //初始化左右两个数组的下标
        int j=0;

        /*
            从数组的leftStart到rightEnd区间内开始循环比较左右两个数组内数值的大小
            如果左数组的某个值小,就把值放入对应的a数组内,左数组的数组下标加1
            如果右数组的某个值小,就把值放入对应的a数组内,右数组的数组下标加1
        */
        for(int k=leftStart; k<rightEnd; k++)
        {
            if(left[i] < right[j])
            {
                a[k] = left[i];
                i = i + 1;
            }else
            {
                a[k] = right[j];
                j = j + 1;
            }
        }
        return a;
    }
}

 

排序算法之归并算法

标签:

原文地址:http://www.cnblogs.com/JTechER/p/4418671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!