`
freshunter
  • 浏览: 15433 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

归并排序算法

阅读更多

    归并排序的思想很简单,就是将多个有序序列组合成一个新的有序序列。

    对于一个无序的序列,我们可以先两两归并,然后四个四个归并,依次类推直到完成排序。这样的排序方式又称之为二路归并排序。

    这里贴了我写的归并排序算法java实现片段,采用了非递归方式:

    protected void sortAlg(int[] ls)
    {
    	int[] tmp = new int[ls.length];
        for(int len = 1; len < ls.length;)
        {
            int unit = len << 1;
            for(int i = 0; i < ls.length;)
            {
                int end = (i + unit >= ls.length) ? ls.length : i + unit;
                if(i + len >= ls.length)
                {
                    break;
                }
                merge(ls, i, i + len - 1, end - 1,tmp);
                if(end == ls.length)
                {
                    break;
                }
                i = i + unit;
            }
            len = unit;
        }

    }

    private void merge(int[] ls, int l, int m, int h, int[] tmp)
    {
        int lp = l;
        int hp = m + 1;
        int tmpi = 0;
        assert tmp.length >= (h-l+1) : "tmp array length more";
    	while(ls[lp]<=ls[hp] && lp<=m)
    	{
    		lp++;
    	}
        int tmpstart = lp;
        while(tmpi < tmp.length && !(lp > m || hp > h))
        {
            if(ls[lp] > ls[hp])
            {
                tmp[tmpi] = ls[hp];
                hp++;
            }
            else
            {
                tmp[tmpi] = ls[lp];
                lp++;
            }
            tmpi++;
        }
        if(hp > h)
        {
            for(int i = lp; i <= m; i++)
            {
                tmp[tmpi] = ls[i];
                tmpi++;
            }
        }
        for(int i = 0; i < tmpi; i++)
        {
            ls[tmpstart + i] = tmp[i];
        }
    }

     与快速排序和堆排序相比,归并排序的最大特点是,它是一种稳定的排序算法。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics