排序算法——归并排序

归并排序算法的思想是分治法:将整个需要排序的数列首先分割成A,B的;如果A,B两个数列有序则分别依次取A,B中最小的数即可。然后就把问题分割成对A,B两个数列中排序。这样一直分割下去,直到一个数列只有一个数据,则开始两两合并数列。最终合并成使得原始的需要排序的数列变成有序的数列。
它的时间复杂度是:O(N*logN)
空间复杂度是:O(N);
归并排序算法是个牺牲空间换时间的算法。而且它是效率高而且稳定的算法。
其Java实现如下

public class MergeSort {
    public static void main(String[] args){
        int [] a = {12,1,22,3,4,65,9,14};
        merge(a,0,a.length-1);
    }
    /**
    *分割数列
    */
    public static void merge(int[]  a,int start,int end){
        if(start >= end){
            return;
        }
        merge(a,start,(start+end)/2);
        merge(a,(start+end)/2+1 ,end);
        mergedSort(a,start,end);
    }
    /**
    *合并数列
    *空间复杂度在这里体现,有个临时数组temp[] 
    */
    public static void mergerSort(int[] a,int start,int end){
        System.out.println(" start: "+start +"  end :"+end);
        int[] temp = new int[end-start+1];
        int in_start = start;
        int in_end = end; 
        int  index = 0;
        int middle = (in_end + in_start)/2;
        int middle1=middle+1;
        while(in_start <= middle && in_end >= middle1){
            if(a[in_start] <= a[middle1] ){
                temp[index++] = a[in_start++];
            }else{
                temp[index++] = a[middle1++];
            }
        };
        while(in_start <= middle){
            temp[index++] = a[in_start++];
        }
        while(middle1 <= in_end){
            temp[index++] = a[middle1++];
        }
        for(int ij = 0;ij < temp.length;++ij){
            a[ij+start] = temp[ij];
        }
        print(a);
    }
    /**
    *输出数组
    */
    public static void print(int[] a){
            for(int i:a){
                System.out.print(i+",");
            }
            System.out.println();
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值