其實就是插入排序,只是插入排序對於當前元素要找到插入哪一個位置的時候須要和以前的元素一個一個比較,比較耗時.java
而折半插入排序利用了當前元素以前的數組元素已經所有排好順序位置的特色,用二分法查找要插入到哪一個位置.因此速度會快一些數組
1 package algorithm.sort; 2 3 import java.util.Arrays; 4 5 public class BinaryInsertSortTest1 { 6 public static void main(String[] args) { 7 int[] arr1 = { 4, 7, 5, 6, 1, 3, 8 }; 8 int[] arr2 = { 7, 6, 5, 4, 3, 2, 1 }; 9 int[] arr3 = { 5, 9, 3, 7, 8, 6, 1, 2, 4 }; 10 int[] arr4 = { 13, 2, 5, 4, 88, 76, 68, 87, 55, 88, 88, 77, 67, 99, 100, 5, 53, 52, 51, 66 }; 11 sort(arr1); 12 sort(arr2); 13 sort(arr3); 14 sort(arr4); 15 System.out.println(Arrays.toString(arr1)); 16 System.out.println(Arrays.toString(arr2)); 17 System.out.println(Arrays.toString(arr3)); 18 System.out.println(Arrays.toString(arr4)); 19 } 20 21 public static void sort(int[] arr) { 22 for (int i = 1; i < arr.length; i++) {// 循環遍歷數組,定第2個元素開始,只有1個元素的話不用排序 23 int value = arr[i]; 24 int low = 0; 25 int mid = 0; 26 int high = i - 1; 27 while (low <= high) { // 2分法查找要插入的位置,終止條件是high=mid-1之後比low小.小於符號的知足條件的狀況是high=low+1,mid=low,high=mid-1<low 28 mid = (low + high) / 2; 29 if (value > arr[mid]) { // 若是比mid大,下次查找的數組爲mid的後半段 30 low = mid + 1; 31 } else { // 不然下次查找的數組爲mid的前半段 32 high = mid - 1; 33 } 34 } 35 // value就應該放到low這個位置,因此把low以後的元素都向後移動一格 36 for (int j = i; j > low; j--) { 37 arr[j] = arr[j - 1]; 38 } 39 arr[low] = value; 40 } 41 } 42 }