[JAVA数据结构]希尔排序/缩小增量法

        前置内容:[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));
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_67719939/article/details/130625666