• 14.插入排序--希尔排序(缩小增量排序)


    希尔排序法基本思想:

    把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;

    随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个记录恰被分成一组,算法便终止

    import java.util.Arrays;
    
    /**
     * 希尔排序
     */
    public class ShellSort {
        //交换式
        public static int[] shellSort(int[] arr){
            int length = arr.length;
            int temp = 0;
            int count = 0;
            //gap 为步长,也是组数
            for (int gap = length/2; gap >0 ; gap/=2) {
                //从第一组的第一个开始遍历所有元素。因为内部循环会-gap,也就是从第一组的第一个开始
                for (int i = gap; i <length; i++) {
                    //遍历组中所有的元素,步长gap,会从后到前把大的排后面
                    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(Arrays.toString(arr));
                }
                System.out.println("第"+(++count)+"轮,步长为"+gap+":="+Arrays.toString(arr));
            }
            return arr;
        }
        //交换式优化->位移式
        public static int[] shellSort2(int[] arr){
            int length = arr.length;
            int temp = 0;
            int count = 0;
            //gap 为步长,也是组数
            for (int gap = length/2; gap >0 ; gap/=2) {
                //
                for (int i = gap; i <length; i++) {
                    int j = i;
                    temp = arr[j];
                    if (arr[j]<arr[j-gap]){
                        //把比temp的都向后移动
                        while (j-gap>=0&&temp<arr[j-gap]){
                            arr[j]=arr[j-gap];
                            j-=gap;
                        }
                        //temp插入
                        arr[j] = temp;
                    }
                    System.out.println(Arrays.toString(arr));
                }
                System.out.println("第"+(++count)+"轮,步长为"+gap+":="+Arrays.toString(arr));
            }
            return arr;
        }
        public static void main(String[] args){
            shellSort(new int[]{8,1,7,2,3,5,4,6,0});
            //[3, 1, 7, 2, 8, 5, 4, 6, 0]
            //[3, 1, 7, 2, 8, 5, 4, 6, 0]
            //[3, 1, 4, 2, 8, 5, 7, 6, 0]
            //[3, 1, 4, 2, 8, 5, 7, 6, 0]
            //[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //第1轮,步长为4:=[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //第2轮,步长为2:=[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 6, 7, 8]
            //[0, 1, 2, 3, 4, 5, 6, 7, 8]
            //第3轮,步长为1:=[0, 1, 2, 3, 4, 5, 6, 7, 8]
            shellSort2(new int[]{8,1,7,2,3,5,4,6,0});
            //[3, 1, 7, 2, 8, 5, 4, 6, 0]
            //[3, 1, 7, 2, 8, 5, 4, 6, 0]
            //[3, 1, 4, 2, 8, 5, 7, 6, 0]
            //[3, 1, 4, 2, 8, 5, 7, 6, 0]
            //[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //第1轮,步长为4:=[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //[0, 1, 4, 2, 3, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //第2轮,步长为2:=[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 3, 2, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 7, 6, 8]
            //[0, 1, 2, 3, 4, 5, 6, 7, 8]
            //[0, 1, 2, 3, 4, 5, 6, 7, 8]
            //第3轮,步长为1:=[0, 1, 2, 3, 4, 5, 6, 7, 8]
        }
    }
  • 相关阅读:
    转一篇GCC相关的文章
    STM32 NVIC
    阻塞套接字返回EAGAIN
    ndk编译libpcap 1.7.4(最终解决方法)
    ndk编译libpcap 1.7.4
    C# 解析torrent文件
    NPOI 读取excel的时候,时间格式的处理
    asp.net webapi 获取报文体的问题
    .net core 2.0 报错:error NU1102: Unable to find package 。。。
    SQL SERVER获取信息的方法
  • 原文地址:https://www.cnblogs.com/fly-book/p/11661548.html
Copyright © 2020-2023  润新知