排序算法--归并排序(JAVA)

1.归并排序思想(参考百度百科)

(1)归并排序主要采用了分治法(Divide and Conquer)的思想。是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
(2)速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

2.归并排序详细分析(以递减为例)(参考百度百科)

归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表(定义函数Merge),然后调用 MergeSort 对子表进行归并,使之成为有序表。

例如:设需排序的数组 a={34,23,12,43 , 22 , 11 , 45 , 32,33 , 11}
(1)调用Merge函数,将数组a分为两部分left={34,23,12,43,22},right={11,45,32,33,11};
(2)对步骤(1)中的left和right分别调用Merge函数;
(3)重复步骤(2),直到字符串的长度为1时,返回字符串。例如,left部分一直划分到最后为:left=Merge({34})={34},right=Merge({23})={23};
(4)再调用MergeSort 对子表进行归并。

3.算法性能

(1)时间复杂度:O(nlogn) 这是该算法中最好、最坏和平均的时间性能。
(2)空间复杂度:O(n)
(3)稳定性:稳定的.
(4)归并排序比较占用内存,但却是一种效率高且稳定的算法。

4.算法实现(java)

public class Solution{

    public static void main(String[]args){ 

        int[] a = {34,23,12,43,22,11,45,32,33,11};
        a=Merge(a,0,a.length-1);    //若不加上“a=”,直接调用Merge函数,会少排序一次~为什么呢?(有时间时查一下)
        for(int i:a){
                System.out.print(i+"  ");
        }
        System.out.println();
    }
    public static int[] Merge(int[] a,int left,int right){

        int alen = right-left;
        if(left==right) {
            int[] temp={a[left]};
            return temp; 
        }
        int mid = left+alen/2;
        int[] leftA = Merge(a,left,mid); //备注:此处是否可以不新建数组,只是标记下标呢(有时间时再想想~)
        int[] rightA = Merge(a,mid+1,right);
        return MergeSort(leftA,rightA);
    }

    public static int[] MergeSort(int[] left,int[] right){

        int alen = left.length;
        int blen = right.length;
        int[] newArray = new int[alen+blen];

        while(i<alen&&j<blen){      
            if(left[i]>=right[j]){
                newArray[k++] = left[i++];
            }else{
                newArray[k++] = right[j++];
            }
        }

        while(i<alen){
            newArray[k++] = left[i++];

        while(j<blen){
            newArray[k++] = right[j++];
        }
        return newArray;
    }       
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值