• 算法之排序算法-shell排序(移位法)


    个人觉得移位法就是借希尔排序进行分组,插入排序进行排序

    注释是上一篇的交换法.

    而且这种移位排序的真的很快

    package com.ebiz.sort;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * @author YHj
     * @create 2019-07-30 8:53
     * shell排序-交换法
     */
    public class Shell{
    
        public static void main(String[] args) {
    
            int[] arr = new int[80000];
            for (int i = 0; i < 80000; i++) {
                arr[i] = (int) (Math.random() * 800000);
            }
    
    
    
            String s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
            System.out.println("排序前 = " + s);
    
            getResult(arr);
    
    
            String l = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
            System.out.println("排序后 = " + l);
    
            //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;
    //                    }
    //                }
    //
    //            }
    //
    //
    //        }
    
            //shell排序-移位法,即插入排序
            //控制分组
            for (int gap = arr.length/2; gap >0 ; gap/=2) {
                //所有组进行排序
                for (int i=gap; i<arr.length;i++){
                    //待排序的数
                    int j=i;
                    int temp=arr[j];
                    //进行比较
                    while (j-gap >= 0 && temp <arr[j-gap]){
                        arr[j]=arr[j-gap];
                        j-=gap;
                    }
                    arr[j]=temp;
                }
    
            }
    
    
        }
    
    }
  • 相关阅读:
    MD5加密40位加密规律
    python中 if __name__ == '__main__': 浅解
    python3关于邮件的操作
    ecshop莫名其妙出现“Table '.starecs_stats' is marked as crashed and should be repaired”
    微擎安装问题
    蝉知CMS本地迁移到服务器具体步骤
    React Hooks useContext + useReducer实现简易Redux
    git merge时merge/squash merge/rebase merge的区别
    FormData 和 Content-Type: multipart/form-data
    对Promise.prototype.finally()的粗浅理解
  • 原文地址:https://www.cnblogs.com/jiushixihuandaqingtian/p/11313073.html
Copyright © 2020-2023  润新知