前置内容:[JAVA]直接插入排序_HY_PIGIE的博客-CSDN博客
希尔排序,是将一个数组分成多组,在每一个组内进行排序。每进行一次排序,组中的元素都会增多,组数减少。
在组内进行直接插入排序
组数以/2的形式减少
例入,一个数组中含有6个元素。初始可以以两个元素为一组,组数gap则为:8/2=4组。
每一组中进行直接插入排序
组中的元素个数进行增大,第二次排序的组数可以为gap:4/2=2;
排序过程:
注意观察,组内的排序是交替进行的,并不是一次将一整内的元素排成有序。
排序后:
第三次排序,组数gap:2/2=1
我们可以发现每次排序后,数组整体都逐渐趋于有序,这时以整个数组为一组,进行整体的排序.
排序后就是:
上代码!
import java.util.Arrays;
public class Test {
public static void shell(int[] array,int gap){
//可以思考一下为什么i从gap开始呢?
//i从gap开始,表示的就是第一组的第二个元素
//gap其实是每一组相邻元素在整体数组内下标的联系
//gap是两个相邻元素的下标的差额
//每个组内进行插入排序
for(int i = gap; i < array.length; i++){
//i表示每一组的开头
//i++表示的是每一组的排序交替进行
//即A组进行一次插入排序后,B组进行一次,然后A在进行一次,循环往复
int j = i - gap;
int tmp = array[i];
for(; j >= 0; j -= gap){
if(tmp < array[j]){
array[j+gap] = array[j];
}else{
break;
}
}
array[j+gap] = tmp;
}
}
public static void shellSort(int[] array){
int gap = array.length;
while(gap > 1){
//最后一次排序是整个数组为一组的时候
gap /= 2;//组数每一次都/2
shell(array,gap);
}
}
public static void main(String[] args) {
int[] array = {12,89,2,4,61,50};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}