• 算法之排序算法-shell排序(交换法)


    可以先看注释掉的分析,最后在看三层for循环

    package com.ebiz.sort;
    
    import java.util.Arrays;
    
    /**
     * @author YHj
     * @create 2019-07-30 8:53
     * shell排序-交换法
     */
    public class Shell{
    
        public static void main(String[] args) {
    
            int [] arr={8,9,1,7,2,3,5,4,6};
            getResult(arr);
           // System.out.println(Arrays.toString(arr));
    
            //第二次分组 5/2=2 2组,每组两个数的间隔步长为2,
            //一组5个数,外层循环,一组比较4次,一共8次
    //        for (int i = 2; i < arr.length; i++) {
    //            //确立要比较的步长的数
    //            for (int j = i-2; j >=0 ; j-=2) {
    //                if (arr[j]>arr[j+2]){
    //                    int temp=arr[j+2];
    //                    arr[j+2]=arr[j];
    //                    arr[j]=temp;
    //                }
    //            }
    //
    //        }
    //        System.out.println(Arrays.toString(arr));
    
            //第3次分组 2/2=1 1组,,每组两个数的间隔步长为1,
            //一组10个数,外层循环,一组比较9次,一共9次
    //        for (int i = 1; i < arr.length; i++) {
    //            //确立要比较的步长的数
    //            for (int j = i-1; j >=0 ; j-=1) {
    //                if (arr[j]>arr[j+1]){
    //                    int temp=arr[j+1];
    //                    arr[j+1]=arr[j];
    //                    arr[j]=temp;
    //                }
    //            }
    //
    //        }
            System.out.println(Arrays.toString(arr));
    
        }
    
        public static void getResult(int[] arr) {
    //        //第一次分组 10/2=5 5组,每组两个数的间隔步长为5,
    //        // 一组两个数,外层循环 一组比较1次,一共5次
    //        for (int i = 5; i < arr.length; i++) {
    //            //确立要比较的步长的数
    //            for (int j = i-5; j >=0 ; j-=5) {
    //                if (arr[j]>arr[j+5]){
    //                    int temp=arr[j+5];
    //                    arr[j+5]=arr[j];
    //                    arr[j]=temp;
    //                }
    //            }
    //
    //        }
    
            //控制分的组数
            for (int i = arr.length/2; i >=1 ; i/=2) {
                //控制每组比较的次数
                for (int j = i; j < arr.length; j++) {
                    //每组进行比较并进行交换
                    for (int k= j-i; k >=0 ; k-=i) {
                        if (arr[k]>arr[k+i]){
                            int temp=arr[k+i];
                            arr[k+i]=arr[k];
                            arr[k]=temp;
                        }
                    }
    
                }
    
    
            }
    
    
        }
    
    }

    待完善...

  • 相关阅读:
    2019年北航OO第三次博客总结
    2019年北航OO第二次博客总结
    2019年北航OO第一次博客总结
    BUAA_OO第四单元总结性博客作业——UML(Floyd实现规则检查?)
    BUAA_OO第三单元总结性博客作业——JML
    BUAA_OO第二单元总结性博客作业——多线程电梯架构
    BUAA_OO第一单元总结性博客作业——表达式求导
    免费虚拟主机 免费云服务器
    .net core API 使用swagger
    Socket学习
  • 原文地址:https://www.cnblogs.com/jiushixihuandaqingtian/p/11299220.html
Copyright © 2020-2023  润新知