插入排序思想:
插入排序分有序区、无序区,最开始有序区没有元素,无序区为整个待排序区。排序时,每一趟排序将一个无序区的元素插入到有序区适当的位置,直到无序区的元素为空。
插入排序根据具体的排序算法不同,又分为直接插入排序、折半插入排序、希尔排序。
折半插入排序:
折半插入排序,在寻找有序区的插入位置时,待插入元素和有序区中间元素比较,如果比中间元素小,在与前半部分有序区的中间元素比较,直到找到插入位置。折半插入排序速度要比直接插入排序要快一点。
折半插入排序java实现:
/**
*
* @param array 待排序数组
*/
static void insertSort(int[] array) {
int j,low, high, mid;
int tmp;//移动元素的暂存变量
int n = array.length;
for (int i = 1; i < n; i++) {//比较轮数固定为n-1
tmp = array[i];
low = 0;
high = i - 1;
while(low <= high) {
mid = (low + high)/2;
if(tmp < array[mid]) {
high = mid - 1;
}else{
low = mid + 1;
}
}
for(j = i - 1; j >= high + 1; j--) {
array[j + 1] = array[j];
}
array[high + 1] = tmp;
}
}
时间复杂度还是,因为移动次数跟直接插入排序一样。
空间复杂度:O(1).
稳定排序