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

《算法导论》习题2.3-6 改进的InsertSort

时间:2014-11-06 21:52:18      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   for   sp   div   log   bs   

InsertSort中有关键的一步是把当前元素A[i]插入到已经排好序的A[1,i-1]的合适的位置上,在原始的InsertSort算法中,

采用的是从后往前一步一步查找的方法,习题2.3-6要求利用习题2.3-5中的binary search的方法,加速这个插入的过程。

把binary search 的算法稍加修改,就可以返回正确的,插入元素的位置:

    public static int findInsertPlace(int [] A,int target,int a, int b)
    {   
        int  middle = a+(b-a)/2;
        if(a>b)
            return a;
        else if (A[middle]==target)
            return middle;
        else if (A[middle]< target)
            return findInsertPlace(A,target,middle+1,b);
        else 
            return findInsertPlace(A,target,a,middle-1);
    }
findInsertPlace和binary search唯一的不同,在于:
if(a>b) return a;
同学们可以动手画一画,检验一下到底对还是不对。
改进后的InsertSort如下:
public class ImprovedInsertSort {
    public static void sort(int [] A)
    {
        for(int i =1; i<A.length;i++)
        {   
            int temp = A[i];
            int insertPlace = findInsertPlace(A,temp,0,i-1);
            for(int j= i-1 ; j>=insertPlace; j--)
                A[j+1] =A[j];
            A[insertPlace] = temp;
        }
        return ;
    }
    public static int findInsertPlace(int [] A,int target,int a, int b)
    {   
        int  middle = a+(b-a)/2;
        if(a>b)
            return a;
        else if (A[middle]==target)
            return middle;
        else if (A[middle]< target)
            return findInsertPlace(A,target,middle+1,b);
        else 
            return findInsertPlace(A,target,a,middle-1);
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int A [] ={1, 7,5,5 ,2, 4,6, 7,4,23,11,34,15};
        ImprovedInsertSort.sort(A);
        for(int a:A)
            System.out.print(a+" ");
    }
}

改进之前,InsertSort在最坏情况下是O(n^2),改进之后,是O( n*lg(n) ),算法效率大大提升了。

 

《算法导论》习题2.3-6 改进的InsertSort

标签:style   blog   color   ar   for   sp   div   log   bs   

原文地址:http://www.cnblogs.com/wzm-xu/p/4079917.html

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