插入排序与希尔排序的联系
插入排序与希尔排序的关系是什么呢?
插入排序
简化版
//先把arr数组中的2,插入到1,3之间
int[] arr = {1, 3, 5, 7, 2};
//-1插到1前面,必须保证end>0
int[] arr1 = {1, 3, 5, -1};
//数组最后一位元素的下标
int end = arr.length - 1;
while (end > 0 && arr[end - 1] > arr[end]) {
int temp = arr[end];
arr[end] = arr[end - 1];
arr[end - 1] = temp;
end--;
}
System.out.println(Arrays.toString(arr));
插入排序无非就是把end从第二个数组元素开始,把end值一直加1。
int[] arr = {13, 11, 15, -11, 99, -10, 0, 22};
for (int i = 0; i < arr.length - 1; i++) {
for (int end = i+1; end > 0 && arr[end - 1] > arr[end]; end--) {
int temp = arr[end];
arr[end] = arr[end - 1];
arr[end - 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
高级版的插入排序
int[] arr = { 5, 93, 8, 92, 7, 91, 6, 90, 1 };
int k = 1;
for (int i = k; i < arr.length; i++) {
int temp = arr[i];
int j = i - k;
for (; j >= 0 && arr[j] > temp; j -= k) {
arr[j + k] = arr[j];
}
arr[j + k] = temp;
}
System.out.println(Arrays.toString(arr));
//[1, 5, 6, 7, 8, 90, 91, 92, 93]
希尔排序
希尔排序只是在插入排序上,多了个跨度k,每个k跨度,进行一次插入排序。
public static void test() {
//希尔排序
int[] arr = {13, 11, 15, -11, 99, -10, 0, 22};
//准备跨度的序列
int k = 1;
while (k < arr.length) {
k = k * 2 + 1;
}
//循环跨度 13 4 1
while (k > 0) {
//根据跨度来进行分组
//思考:为什么从g开始而不是从0开始:子序列是插入排序
for (int i = k; i < arr.length; i++) {
//找到当前分组的第一个要排序的值
int temp = arr[i];//这是我们要插入的值
int j = i - k;//找到当前子序列的前一位
//插入排序
//倒序找前一位,允许游标为负值,游标为负值,不再进入
while (j >= 0 && arr[j] > temp) {
//谁和谁交换
arr[j + k] = arr[j];//把当前的交给前面一位
j -= k;//继续找下一个,直到下一个的游标小于0
}
//把最后一位补上
arr[j + k] = temp;
}
System.out.println("跨度:" + k);
k /= 2;
}
System.out.println(Arrays.toString(arr));
}