zoukankan      html  css  js  c++  java
  • 插入排序之希尔排序(Java)

    插入排序之希尔排序(Java)

    博客说明

    文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

    希尔排序法介绍

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

    希尔排序法基本思想

    希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

    代码(交换式)

    package cn.guizimo.sort;
    
    import java.util.Arrays;
    
    public class ShellSort {
        public static void main(String[] args) {
            int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
            System.out.println("排序前");
            System.out.println(Arrays.toString(arr));
            shellSort(arr);
            System.out.println("排序后");
            System.out.println(Arrays.toString(arr));
        }
    
        public static void shellSort(int[] arr) {
            int count = 0;
            for (int gap = arr.length / 2; gap > 0; gap /= 2) {
                count++;
                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("第"+count+"轮排序");
                System.out.println(Arrays.toString(arr));
            }
    
        }
    }
    
    
    测试

    image-20200627112239838

    测试速度

    package cn.guizimo.sort;
    
    import java.util.Arrays;
    
    public class ShellSort {
        public static void main(String[] args) {
            int max = 80000;
            int[] arr = new int[max];
            for (int i = 0; i < max; i++) {
                arr[i] = (int)(Math.random() * 8000000);
            }
            long date1 = System.currentTimeMillis();
            shellSort(arr);
            long date2 = System.currentTimeMillis();
            System.out.println("交换式希尔排序"+max+"数组的时间为:"+(date2-date1));
        }
    
        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;
                        }
                    }
                }
            }
    
        }
    }
    
    

    image-20200627112432454

    代码(位移式)

    package cn.guizimo.sort;
    
    import java.util.Arrays;
    
    public class ShellSort {
        public static void main(String[] args) {
            int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
            System.out.println("排序前");
            System.out.println(Arrays.toString(arr));
            shellSort(arr);
            System.out.println("排序后");
            System.out.println(Arrays.toString(arr));
        }
    
    
        public static void shellSort(int[] arr) {
            int count = 0;
            for (int gap = arr.length / 2; gap > 0; gap /= 2) {
                count++;
                for (int i = gap; i < arr.length; i++) {
                    int j = i;
                    int temp = arr[i];
                    if(arr[j]<arr[j-gap]){
                        while (j-gap >= 0 && temp < arr[j-gap]){
                            arr[j] = arr[j-gap];
                            j -= gap;
                        }
                        arr[j] = temp;
                    }
                }
                System.out.println("第"+count+"轮排序");
                System.out.println(Arrays.toString(arr));
            }
    
        }
    }
    
    
    测试

    image-20200627113534689

    速度测试

    package cn.guizimo.sort;
    
    import java.util.Arrays;
    
    public class ShellSort {
        public static void main(String[] args) {
            int max = 80000;
            int[] arr = new int[max];
            for (int i = 0; i < max; i++) {
                arr[i] = (int)(Math.random() * 8000000);
            }
            long date1 = System.currentTimeMillis();
            shellSort(arr);
            long date2 = System.currentTimeMillis();
            System.out.println("位移式希尔排序"+max+"数组的时间为:"+(date2-date1));
    
        }
    
        public static void shellSort(int[] arr) {
            for (int gap = arr.length / 2; gap > 0; gap /= 2) {
                for (int i = gap; i < arr.length; i++) {
                    int j = i;
                    int temp = arr[i];
                    if(arr[j]<arr[j-gap]){
                        while (j-gap >= 0 && temp < arr[j-gap]){
                            arr[j] = arr[j-gap];
                            j -= gap;
                        }
                        arr[j] = temp;
                    }
                }
            }
        }
    }
    
    

    image-20200627113830366

    感谢

    尚硅谷

    万能的网络

    以及勤劳的自己
    关注公众号: 归子莫,获取更多的资料,还有更长的学习计划

  • 相关阅读:
    最富有客户的资产总量
    无重叠区间
    工作流分析推荐
    sharepoint外包和定制开发公司分析比较及推荐
    sharepoint开发企业信息门户系统分析及公司推荐
    北京sharepoint开发公司比较推荐
    国内市场主流专业的sharepoint开发公司分析比较及推荐
    北京工作流软件公司分析比较和推荐
    国内市场主流专业的工作流(bpm)软件分析、比较及推荐
    Hibernate的多对多实例
  • 原文地址:https://www.cnblogs.com/guizimo/p/13197839.html
Copyright © 2011-2022 走看看