折半插入排序介绍:
折半插入排序是对直接插入排序的一种改良方式,在直接插入排序中,每次向已排序序列中插入元素时,都要去寻找插入元素的合适位置,但是这个过程是从已排序序列的最后开始逐一去比较大小的,这其实很是浪费,因为每比较一次紧接着就是元素的移动。折半排序就是通过折半的方式去找到合适的位置,然后一次性进行移动,为插入的元素腾出位置。什么是折半的方式去找合适的位置呢,那就是折半查找了,因为在已排序的序列中,序列元素都是按照顺序排列的,既然这样,完全不需要逐一去比较大小,而是去比较已排序序列的中位数,这个中间的位置将一排序列分为左右两部分,通过一次比较后,就缩小了比较的范围,重复这样的操作,需要插入的元素就找到了合适的位置了。
代码实现:
package com.example.demo.sort;
import java.util.Arrays;
/**
* 折半插入排序
*/
public class HalfInsertSort {
public static void halfInsertSort(int[] array) {
int inserValue = 0;
for (int i = 1; i < array.length; i++ ) {
int low = 0;
int hight = i -1;
inserValue = array[i];
while (hight >= low) {
int mid = (low + hight) / 2;
if (array[mid] > inserValue) {
hight = mid - 1;
} else {
low = mid + 1;
}
}
for (int j = i - 1; j > hight; j --) {
array[j + 1] = array[j];
}
array[hight + 1] = inserValue;
}
}
public static void main(String[] args) {
int a[] = {8, 5, 4, 3, 2, 1, 6, 7};
System.out.println("Before: " + Arrays.toString(a));
//System.out.println(5/2);
halfInsertSort(a);
System.out.println("After: " + Arrays.toString(a));
}
}