/**
* 名称: 希尔排序
* 说明: 相当于直接插入排序前加入了分组 第一步: 分组 第二部: 进行直接插入排序
* gap: 增量,分几个组即增量为多少
* gap的选取: gap = 数组长度/2
*
* 分组:
* 目的: 提高插入排序的效率
* 原理: 在gap不为一时进行的分组排序都为预排序(是数据逐渐趋向于有序),以便gap为1时进行直接插入排序
* 操作: 分组时从第一个元素开始然后中间相隔gap-1个元素的元素分入同一组
*
* 时间复杂度: O(N^1.3 - N^1.5)
* 空间复杂度: O(1)
* 稳定性: 不稳定
*/
分组操作画图说明
代码实现(未改进版本)
public static void main1(String[] args) {
int[] arrary = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5};
int gap = 5;
shellsort(arrary, gap);
System.out.println(Arrays.toString(arrary));
gap = 2;
shellsort(arrary, gap);
System.out.println(Arrays.toString(arrary));
gap = 1;
shellsort(arrary, gap);
System.out.println(Arrays.toString(arrary));
}
public static void shellsort(int[] arr, int gap){
int tmp = 0;
for (int i = gap; i < arr.length ; i++) {
tmp = arr[i];
for (int j = i - gap; j >= 0;) {
if(tmp < arr[j]){
arr[j+gap] = arr[j];
j -= gap;
arr[j+gap] = tmp;
}else{
break;
}
}
}
}
代码允许截图
改进版
public static void main(String[] args) {
int[] arrary = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5};
int gap = arrary.length/2;
while (gap > 1){
shellsort(arrary, gap);
gap /= 2;
}
shellsort(arrary, gap);
System.out.println(Arrays.toString(arrary));
}
public static void shellsort(int[] arr, int gap){
int tmp = 0;
for (int i = gap; i < arr.length ; i++) {
tmp = arr[i];
for (int j = i - gap; j >= 0;) {
if(tmp < arr[j]){
arr[j+gap] = arr[j];
j -= gap;
arr[j+gap] = tmp;
}else{
break;
}
}
}
}
运行截图