基本思想:插入排序的基本操作是在一个有序表中进行查找和插入,用折半查找实现查找步骤。
复杂度:时间复杂度 O(n2) 空间复杂度O(1)
JAVA源代码(成功运行):
package testSortAlgorithm;
public class BinaryInsertionSort {
public static void main(String[] args) {
// 0下标数据用来作为哨兵
int[] array = { 0, 49, 38, 65, 97, 76, 13, 27 };
binaryInsertSort(array);
for (int i = 1; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
public static void binaryInsertSort(int[] array) {
int low, high, mid;
for (int i = 2; i < array.length; i++) {
// 哨兵位
array[0] = array[i];
// 要将第i位插入前i-1有序序列
low = 1;
high = i - 1;
// 折半查找
while (low <= high) {
mid = (low + high) / 2;
System.out.println("low " + low + " high " +high + " mid " + mid);
if (array[0] < array[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
// 要插入high+1位置,需要把high+1——i-1位置上的数据依次后移一位
for (int j = i - 1; j >= high + 1; j--) {
array[j + 1] = array[j];
}
array[high + 1] = array[0];
}
}
}
折半查找算法(前提是数据已经排好序)
package testSortAlgorithm;
public class BinarySearch {
public static void main(String[] args) {
int a[] = {1,3,6,8,9,10,12,18,20,34};
int i = 12;
System.out.println(binarySearch(a,i));
}
public static int binarySearch(int[]a ,int num){
if (a.length == 0) {
return -1;
}
int startPosition = 0;
int endPosition = a.length - 1;
int midPosition = (startPosition + endPosition)/2;
while (startPosition <= endPosition) {
if (a[midPosition] == num) {
return midPosition;
}
if (a[midPosition] > num ) {
endPosition = midPosition - 1;
}
if (a[midPosition] < num ) {
startPosition = midPosition + 1 ;
}
midPosition = (startPosition + endPosition)/2;
}
return -1;
}
}