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

归并排序

时间:2018-02-15 11:54:05      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:str   .so   代码   sys   alt   时间   ring   分享   for   

1. 从网上找到一张归并排序的图解,如下:

技术分享图片

  可以看出,归并排序主要运用分治的思想,将要排序的数组由大化小,分别排序后再进行合并。时间复杂度是 O(nlogn)。

2. 归并排序的特点:

            优点:稳定
            缺点:需要线性的额外空间    
 
3. JAVA代码如下:
public class GB
{
   //将两个有序数组合并成一个数组,此处是将一个数组分为两个有序,再合并
    private void Merge(int []a,int first,int mid, int last, int [] temp)
    {
        int i = first;
        int m = mid;
        int j = mid+1;
        int n = last;
        int k = 0;
        while( i<=m && j<=n)
        {
            if(a[i]<=a[j])
                temp[k++] = a[i++];
            else
                temp[k++] = a[j++];
        }
        while(i <= m)
            temp[k++] = a[i++];
        while(j <= n)
            temp[k++] = a[j++];
        for(int z=0;z<k;z++)
        {
            a[first+z] = temp[z];
        }
    }
    private void sort(int [] a, int first, int last, int [] temp)
    {
        if(first < last)
        {
            int mid = (first+last)/2;
            //分的过程:
            this.sort(a,first,mid,temp);
            this.sort(a,mid+1,last,temp);
            //治的过程:
            this.Merge(a,first,mid,last,temp);
        }
    }
    public void Sort(int [] a)
    {
        int [] temp = new int[a.length];
        this.sort(a, 0, a.length-1, temp);
    }
    public void print(int [] a)
    {
        for(int i : a)
            System.out.print(i+" ");
        System.out.println();
    }
    public static void main(String[] args)
    {
        int [] a = {2,5,1,2,8,5,9,10,4};
        GB gb = new GB();
        gb.print(a);
        gb.Sort(a);
        gb.print(a);
    }
}

 

 

归并排序

标签:str   .so   代码   sys   alt   时间   ring   分享   for   

原文地址:https://www.cnblogs.com/ladawn/p/8449359.html

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