/* 1.直接插入排序:每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入.
* 最坏情况下:时间复杂度为O(n^2)---无序的时候;
* 最好情况下:时间复杂度为O(n)---有序的时候;
* 空间复杂度:O(1);
* 注意:越有序排序速度越快;
* 稳定性:稳定排序;
* 2.两个重要特点:
*(1)如果当前这个序列很短,那么插入排序很高效;
*(2)如果当前这个序列,基本有序,那么插入排序效率也很高.*/
public static void insertSort1(int[] array) {
// bound 变量来把整个数组分成两个区间
// [0, bound) 已排序区间
// [bound, size) 待排序区间
for (int bound = 1; bound < array.length; bound++) {
// bound 下标对应的元素就是待插入元素.
// 把这个元素放到前面的有序顺序表中的合适位置
int tmp = array[bound];
int cur = bound - 1;
//cur--从后往前循环,每次往前走一步
//>=才能满足将元素放在0号下标。
for (; cur >= 0; cur--) {
//如果array[cur] >= tmp,就是不稳定排序.
if (array[cur] > tmp) {
//搬运元素
array[cur + 1] = array[cur];
} else {
break;
}
}
array[cur + 1] = tmp;
}
}
/*
* 2.希尔排序:希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,
* 所有距离为的记录分在同一组内,并对每一组内的记录进行排序。
* 然后取重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序
* 最坏情况下:时间复杂度O(n^1.5);
* 最好情况下:时间复杂度O(n);
* 稳定性:不稳定;
* 空间复杂度:O(1);*/
public static void shellSort(int[] array) {
//计算增量的经典算法
int gap = array.length;
while (gap > 1) {
shell(array, gap);
gap = gap / 2;
}
shell(array, 1);
}
//gap->组数 进行组内直接插入排序
private static void shell(int[] array, int gap) {
for (int bound = 1; bound < array.length; bound++) {
int tmp = array[bound];
int cur = bound - gap;
// 同组之内的相邻元素之间下标差了 gap
for (; cur >= 0; cur -= gap) {
if (array[cur] > tmp) {
array[cur + gap] = array[cur];
} else {
break;
}
}
array[cur + gap] = tmp;
}
}