首页 > 编程语言 > 详细

排序算法

时间:2016-07-12 17:06:55      阅读:196      评论:0      收藏:0      [点我收藏+]

1.归并排序  时间复杂度 平均情况与最坏情况为 O(nlog(n))

技术分享
public class MergeSort {
    //将一个数组中的两个有序区间[p,q]和(q,r]合成为一个有序区间[p,r]
    //没有返回值也可,因为数组传的是引用
    public int[] merge(int a[],int p,int q,int r){
        //新建两个数组分别存放这两个有序区间
        int[] b = new int[q-p+1];
        int[] d = new int[r-q];
        for(int i = p,k = 0;i<q+1;i++,k++){
            b[k] = a[i];
        }
        for(int i = q+1,k = 0;i<r+1;i++,k++){
            d[k] = a[i];
        }
        int i =0, j =0;
        while(i!=b.length&&j!=d.length){
            if(b[i]<d[j]){
                a[p] = b[i];
                i++;
            }else{
                a[p] = d[j];
                j++;
            }
            p++;
        }
        //数组中剩余的部分,只用复制左半部分的剩余,因为右半部份已经在目标数组中
        if(i!=b.length){
            for(int l = i;l<b.length;l++,p++){
                a[p] = b[l];
            }
        }
        return a;
    }
    public int[] mergeSortF(int nums[],int a,int b){
        //a==b时,表示只有一个元素,则不用进行排序,此时就是递归的终结条件
        if(a<b){
            mergeSortF(nums,a,(a+b)/2);
            mergeSortF(nums,1+(a+b)/2,b);
            return merge(nums,a,(a+b)/2,b);
        }else
            return null;
    }
    //没有返回值也可,因为数组传的是引用
/*    public void mergeSortF(int nums[],int a,int b){
        if(a<b){
            mergeSortF(nums,a,(a+b)/2);
            mergeSortF(nums,1+(a+b)/2,b);
            merge(nums,a,(a+b)/2,b);
        }
    }*/
    public static void main(String[] args){
        MergeSort m = new MergeSort();
        int[] a = {6,1,2,4,5,0,3};
        int[] b = {2,3,5,7,8,10,15};
        int[] c = m.mergeSortF(a,0,6);
        for(int i =0;i<c.length;i++){
            System.out.print(c[i]+" ");
        }
    }
}
View Code

 

排序算法

原文:http://www.cnblogs.com/fisherinbox/p/5664028.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!