• 算法笔记_011:希尔排序


    1 问题描述

    给定一组数据,请使用希尔排序获取这组数据的非降序序列。


    2 解决方案

    2.1 希尔排序原理简介

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DLShell1959年提出而得名。

    该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个增量的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小,即增量大小为1)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

    我们来通过以下示意图,更深入的理解一下具体原理(PS:图中gap为增量):


    2.2 具体编码

    package com.liuzhen.chapterFour;
    
    public class ShellSort {
        public static void getShellSort(int[] A){
            int len = A.length;    
            int x = 0;  //定义进行希尔排序的次数
            for(int gap = len/2;gap >= 1;gap = gap/2){  //步长
                System.out.print("第"+x+"次希尔排序序列:");
                for(int p = 0;p < len;p++)
                    System.out.print(A[p]+"	");
                System.out.println();
                x++;         
                for(int i = 0;i < gap;i++){             //按照步长进行分组
                    for(int j=i+gap;j < len;j += gap){  //对每个分完的小组进行直接插入排序
                        if(A[j] < A[j-gap]){
                            int temp = A[j];
                            int k = j - gap;
                            while(k >= 0 && A[k] > temp){
                                A[k+gap] = A[k];
                                k -= gap;
                            }
                            A[k+gap] = temp;
                        }
                    }
                }
                
            }
            System.out.print("第"+x+"次希尔排序序列:");
            for(int p = 0;p < len;p++)
                System.out.print(A[p]+"	");
            System.out.println();
            
        }
        public static void main(String[] args){
            int[] A = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4};
            getShellSort(A);
        }
    }

    运行结果:

    第0次希尔排序序列:49    38    65    97    26    13    27    49    55    4    
    第1次希尔排序序列:13    27    49    55    4    49    38    65    97    26    
    第2次希尔排序序列:4    26    13    27    38    49    49    55    97    65    
    第3次希尔排序序列:4    13    26    27    38    49    49    55    65    97    

    参考资料:

            1、白话经典算法系列之三 希尔排序的实现

            2、排序四 希尔排序

     

  • 相关阅读:
    python函数第4天(day 23)
    python函数第3天(day 22)
    python函数第2天(day 21)
    python函数第一天(day 20)
    opencv笔记一(Mat初始化及Mat传递)
    ubuntu上opencv源码安装
    ubuntu上显卡驱动安装——GeForce GTX 1080 Ti
    ubuntu上CUDA9.0和CUDNN7.0安装
    vscode配置opencv c++开发环境
    opencv中Mat的属性
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6220991.html
Copyright © 2020-2023  润新知