插入排序
算法思想:就是从第二个数开始位置记为i,值记为temp,与前面的数进行比较,找到比temp大的那个数的位置记为j。然后从j到i这些数集体后移一位,为temp留出插入的位置,依次类推。虽然时间效率不高但是空间效率高。
从小到大排序;
public class InsertSort {
private static void insertSort(int[] arr) {
int length = arr.length;
for (int i = 1; i < length; i++) {
//整体后移时, 保证arr[i] 的值不会丢失
int temp = arr[i];
//i索引处的值以及比前面所有值都大,表明已经有序, 无需插入
//(i-1)索引之前的数据已经是有序的,i-1索引处的元素的值就是最大值
if (arr[i] > arr[i - 1]) {
int j = i - 1;
//整体后移一格
for (; j >= 0 && arr[j] < temp; j--) {
arr[j + 1] = arr[j];
}
// j+1 的原因: 是因为上面循环写的j--, 所以是j+1
// 最后将temp的值插入合适的位置
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
public static void main(String[] args) {
int[] arr = new int[]{4, 2, 9, 7, 5, 73};
insertSort_test2(arr);
}
}
第一次从2开始[2 ,4 ,9 ,7 ,5 ,73]
[2,4,7,9,5,73]
数组为 [2,4,7,7,9,73] 当i= 4;temp = 5;j = 2的位置是temp插入的位置;
[2,4,5,7,9,73]
折半插入
在插入排序的基础上对已经有序的序列中利用二分查找的思想进行插入。
从中间值mid开始查看,i 位置上的数位置在mid的左边还是右边,如果位于左边,查找位置的效率将会提高。
上代码
public class BinartInsertSort {
private static void binaryInsertSort(int[] arr) {
int length = arr.length;
for (int i = 1; i < length; i++) {
//当整体后移时,保证arr[i] 的值不会丢失
int temp = arr[i];
int low = 0;
int high = i - 1;
while (low <= high) {
//找到low, high 中间索引
int mid = (low + high) / 2;
if (temp < arr[mid]) {
//限制在索引大于mid 的那一半中搜索
low = mid + 1;
} else {
//限制在索引小于mid 的那一半中搜索
high = mid - 1;
}
}
//将low 到i处的所有元素向后整体移动一位
for (int j = i; j > low; j--) {
arr[j] = arr[j - 1];
}
arr[low] = temp;
}
System.out.println(Arrays.toString(arr));
}
public static void main(String[] args) {
int[] arr = new int[]{6, 3, 1, 10, 9, 2};
binaryInsertSort2(arr);
}
}