【数据结构22】希尔排序

梦想与她 提交于 2020-01-18 08:17:38

1. 希尔排序介绍在这里插入图片描述

在这里插入图片描述

2. 希尔排序思路

在这里插入图片描述
在这里插入图片描述

3. 代码实现

在这里插入图片描述

3.1 交换法

希尔排序推导过程:

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {8,9,1,7,2,3,5,4,6,0};
        System.out.println("排序前:"+Arrays.toString(arr));
        shellSort(arr);
    }

    public static void shellSort(int[] arr){
        int temp=0;

        //第一轮排序:将10个数据分成5组
        for(int i=5;i<arr.length;i++){
            //如果当前元素大于步长后面的那个元素,说明交换
            for(int j=i-5;j>=0;j-=5){
                if(arr[j]>arr[j+5]){
                    temp = arr[j];
                    arr[j] = arr[j+5];
                    arr[j+5] = temp;
                }
            }
        }
        System.out.println("第1轮:");
        System.out.println(Arrays.toString(arr));

        //第2轮排序:将10个数据分成2组
        for(int i=2;i<arr.length;i++){
            //如果当前元素大于步长后面的那个元素,说明交换
            for(int j=i-2;j>=0;j-=2){
                if(arr[j]>arr[j+2]){
                    temp = arr[j];
                    arr[j] = arr[j+2];
                    arr[j+2] = temp;
                }
            }
        }
        System.out.println("第2轮:");
        System.out.println(Arrays.toString(arr));

        //第2轮排序:将10个数据分成1组
        for(int i=1;i<arr.length;i++){
            //如果当前元素大于步长后面的那个元素,说明交换
            for(int j=i-1;j>=0;j-=1){
                if(arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println("第3轮:");
        System.out.println(Arrays.toString(arr));
    }
}

使用for循环简化代码:

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {8,9,1,7,2,3,5,4,6,0};
        System.out.println("排序前:"+Arrays.toString(arr));
        shellSort(arr);
    }

    public static void shellSort(int[] arr){
        for(int gap = arr.length/2;gap>0;gap/=2){
            int temp=0;
            for(int i=gap;i<arr.length;i++){
                //如果当前元素大于步长后面的那个元素,说明交换
                for(int j=i-gap;j>=0;j-=gap){
                    if(arr[j]>arr[j+gap]){
                        temp = arr[j];
                        arr[j] = arr[j+gap];
                        arr[j+gap] = temp;
                    }
                }
            }
            System.out.println("第"+gap+"轮:");
            System.out.println(Arrays.toString(arr));
        }
    }
}

在这里插入图片描述

3.2 移动法

//对交换式的希尔排序进行优化,移动法
public static void shellSort2(int[] arr){
   //增量gap
   for(int gap = arr.length/2;gap>0;gap/=2){
       //从第gap个元素,逐步对其所在的组进行直接插入排序
       for(int i=gap;i<arr.length;i++){
           int j = i;
           int temp = arr[j];
           if(arr[j]<arr[j-gap]){
               while (j-gap>=0  && temp<arr[j-gap]){
                   arr[j]= arr[j-gap];
                   j-=gap;
               }
               //退出循环后,就给gap找到了插入的位置
               arr[j] = temp;
           }
       }
       System.out.println(Arrays.toString(arr));
   }
}

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!