一、基本原理
将一个数插入到已排序好的数列中,从而得到一个新的,个数+1的新的有序数列。
二、算法分析
以数组{6, 3, 8, 2, 9, 1,7}为例:
- i = 1:取3插入到有序数列[6]中,得到新的数列:{3, 6, 8, 2, 9, 1,7}
- i = 2:取8插入到有序数列[3,6]中,得到新的数列:{3, 6, 8, 2, 9, 1,7}
- i = 3:取2插入到有序数列[3,6,8]中,得到新的数列:{2, 3, 6, 8, 9, 1,7}
- i = 4:取9插入到有序数列[2,3,6,8]中,得到新的数列:{2, 3, 6, 8, 9, 1,7}
- i = 5:取1插入到有序数列[2,3,6,8,9]中,得到新的数列:{1, 2, 3, 6, 8, 9, 7}
- i = 6:取7插入到有序数列[1,2,3,6,8,9]中,得到新的数列:{1, 2, 3, 6, 7, 8, 9}
三、算法实现
import java.util.Arrays;
public class QuickInsertSort {
public static void main(String[] args) {
int[] arr = {6, 3, 8, 2, 9, 1, 7};
for (int i = 1, len = arr.length; i < len; i++) {
int p = arr[i];
if (p > arr[i-1]) {
continue;
}
int idx = 0;
for (int j = i - 1; j >= 0; j--) {
if (arr[j] < p) {
idx = j + 1;
break;
}
}
System.arraycopy(arr, idx, arr, idx + 1, i - idx);
arr[idx] = p;
System.out.println(Arrays.toString(arr));
}
}
}
四、二分查找算法实现:
public static void binaryInsertSort() {
for (int i = 1, len = arr.length; i < len; i++) {
int p = arr[i];
if (p > arr[i-1]) {
continue;
}
int left = 0;
int right = i - 1;
int mid = 0;
while (left <= right) {
mid = (right + left) /2;
if (arr[mid] >= p) {
right = mid - 1;
} else {
left = mid + 1;
}
}
System.arraycopy(arr, left, arr, left + 1, i - left);
arr[left] = p;
System.out.println(Arrays.toString(arr));
}
}