标签: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) ),算法效率大大提升了。
标签:style blog color ar for sp div log bs
原文地址:http://www.cnblogs.com/wzm-xu/p/4079917.html