Java排序算法(六):折半插入排序
折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态。
代码实现:
- package sort;
- public class BinaryInsertSortTest {
- public static int count = 0;
- public static void main(String[] args) {
- int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
- print(data);
- binaryInsertSort(data);
- print(data);
- }
- public static void binaryInsertSort(int[] data) {
- for (int i = 1; i < data.length; i++) {
- if (data[i] < data[i - 1]) {
- // 缓存i处的元素值
- int tmp = data[i];
- // 记录搜索范围的左边界
- int low = 0;
- // 记录搜索范围的右边界
- int high = i - 1;
- while (low <= high) {
- // 记录中间位置
- int mid = (low + high) / 2;
- // 比较中间位置数据和i处数据大小,以缩小搜索范围
- if (data[mid] < tmp) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
- //将low~i处数据整体向后移动1位
- for (int j = i; j > low; j--) {
- data[j] = data[j - 1];
- }
- data[low] = tmp;
- print(data);
- }
- }
- }
- public static void print(int[] data) {
- for (int i = 0; i < data.length; i++) {
- System.out.print(data[i] + "\t");
- }
- System.out.println();
- }
- }
运行结果:
- 5 3 6 2 1 9 4 8 7
- 3 5 6 2 1 9 4 8 7
- 2 3 5 6 1 9 4 8 7
- 1 2 3 5 6 9 4 8 7
- 1 2 3 4 5 6 9 8 7
- 1 2 3 4 5 6 8 9 7
- 1 2 3 4 5 6 7 8 9
- 1 2 3 4 5 6 7 8 9