折半插入排序(折半查找+插入排序)
- 基本思想:当排序的记录很长时,直接插入排序就会浪费太多时间,在查找时采用折半查找更为省时。
- 时间复杂度:仅减少了比较次数,移动次数不变,所以还是O(n^2),空间复杂度:O(1)
- 相同值排序后顺序不变,稳定
- 实现思路:与直接插入基本相同,在内循环时使用折半查找。
package com.xjccgg.SortTest;
import java.util.Arrays;
public class a_insert {
public static void main(String[] args) {
int[] arr = {64,85,31,57,54,66,22,44,57,2};
binaryInsertionSort(arr);
}
public static int[] binaryInsertionSort(int[] arr) {
int temp = 0;
for (int j = 2; j < arr.length; ++j) {
int low = 0 , high = j , i = 0;
while (low <= high) {
i = (low + high) / 2;
if (arr[j] > arr[i]) {
i++;
low = i;
} else{
high = i - 1;
}
}
for (; i < j; i++) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
System.out.println("第" + j + "趟排序 " + Arrays.toString(arr));
}
return arr;
}
}
排序结果
第0趟排序 [64, 85, 31, 57, 54, 66, 22, 44, 57, 2]
第1趟排序 [64, 85, 31, 57, 54, 66, 22, 44, 57, 2]
第2趟排序 [31, 64, 85, 57, 54, 66, 22, 44, 57, 2]
第3趟排序 [31, 57, 64, 85, 54, 66, 22, 44, 57, 2]
第4趟排序 [31, 54, 57, 64, 85, 66, 22, 44, 57, 2]
第5趟排序 [31, 54, 57, 64, 66, 85, 22, 44, 57, 2]
第6趟排序 [22, 31, 54, 57, 64, 66, 85, 44, 57, 2]
第7趟排序 [22, 31, 44, 54, 57, 64, 66, 85, 57, 2]
第8趟排序 [22, 31, 44, 54, 57, 57, 64, 66, 85, 2]
第9趟排序 [2, 22, 31, 44, 54, 57, 57, 64, 66, 85]