对于一个有序的数组而言,折半查找的性能明显会更优于顺序查找,因此,在array[0]-array[i-1]中按照关键字在有序的序列中确定array[i] 的插入位置时,可利用折半查找实现该位置的确定。该方案与之前的直接插入算法思想一致,仅仅是将确定插入位置的方法由倒序查找变为二分查找而已。
处理该方案的主要细节问题是,在执行过程中当high和low指向同一索引值时,移动数据量的规模,二分查找很好的避免了该问题,都是移动i-1到low索引的数据,若array[mid]>temp,high -1,low 不变,若array[mid]<=temp,low+1,正好从low的下一个数据开始移动。
代码如下:
import java.util.Arrays; public class BiInsertSort { public static void biInsertSort(int[] array) { //从数组的1开始进行遍历 for (int i = 1; i < array.length; i++) { //优化减低不必要的内层循环次数 if (array[i] < array[i - 1]) { int temp = array[i]; int low = 0; int high = i - 1; int mid; //在查找时,程序将很好处理low和high指向同一索引,此时的array[low],与array[i]的大小比较 //该设计会再次执行判断条件,若小于,low+1,将low+1之后的数据移动一位,若大于,则将low之后的所有数据移动一位 //无需考虑在移动数据的规模时,high和low指向同一处时,不同的策略 while (low <= high) { mid = (low + high) / 2; if (array[mid] > temp) { high = mid - 1; } else { low = mid + 1; } } for (int j = i - 1; j >= low; j--) { array[j + 1] = array[j]; } array[low] = temp; //打印每一趟的结果 System.out.println(Arrays.toString(array)); } } } //进行方法的测试 public static void main(String[] args) { int[] array = {-2,2,3,-1,-9}; biInsertSort(array); } }