实现原理:
直接插入排序:是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
二分法插入排序:利用二分法查找未排序数据在有序序列中的位置,比起直接插入排序,减少了比较次数。
时间复杂度:直接插入排序和二分法插入排序都是O(n^2)
空间复杂度:O(1)
public class InsertionSort {
private static int[] insertSort(int[] arr) {
int n = 1;
while(n < arr.length) {
int num = arr[n];
for(int i=n-1; i>=0; i--) {
if(arr[i] > num) {
arr[i+1] = arr[i];
} else {
arr[i+1] = num;
// print(arr);
break;
}
}
n ++;
}
return arr;
}
/**
* 二分插入排序
* @param arr
*/
private static void insertionSortByBinarySearch(int[] arr) {
int n = 1;
while(n < arr.length) {
int temp = arr[n];
int index = binarySearch(arr, 0, n-1, temp);
for(int i=n-1; i>=index; i--) {
arr[i+1] = arr[i];
}
arr[index] = temp;
n ++;
// print(arr);
}
}
/**
* 二分法查找某个数应该存放在有序数组的哪个位置
* @param arr
* @param num
* @return int 存放位置index
*/
private static int binarySearch(int[] arr, int star, int end, int num) {
int middle = 0;
while(star <= end) {
middle = (star + end) / 2;
if(arr[middle] > num) {
end = middle - 1;
} else {
star = middle + 1;
}
}
return star;
}
private static void print(int[] arr) {
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr1 = new int[100000];
int[] arr2 = new int[100000];
Random random = new Random();
int temp;
for(int i=0; i<arr1.length; i++) {
temp = random.nextInt(11);
arr1[i] = temp;
arr2[i] = temp;
}
System.out.println(arr1);
System.out.println(arr2);
long star = System.currentTimeMillis();
insertSort(arr1);
System.out.println("普通插入排序时间: " + (System.currentTimeMillis()-star) + "毫秒");
star = System.currentTimeMillis();
insertionSortByBinarySearch(arr2);
System.out.println("二分查询插入排序时间: " + (System.currentTimeMillis()-star) + "毫秒");
}
}