zoukankan      html  css  js  c++  java
  • 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]
        }
    }
  • 相关阅读:
    JQuery.Ajax 错误调试帮助信息
    获取当前时间差
    选中复选框
    生成一个连接对象 生成静态页
    64位系统IIS开启32位兼容模式命令
    分割table获取数据
    JS 获取倒计时
    SqlServer 日期时间格式转换
    js 获得光标所在的文本框(text/textarea)中的位置
    .net 数据库链接的字符串
  • 原文地址:https://www.cnblogs.com/fly-book/p/11661548.html
Copyright © 2011-2022 走看看