• Java实现希尔排序


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

    2 解决方案
    2.1 希尔排序原理简介

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

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

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

    在这里插入图片描述

    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    
    
  • 相关阅读:
    我所认识的JavaScript
    谈如何边做事,边提高
    对JavaScript开发中困扰的思考
    Soundex语音算法
    Perl分割字符串的一个精妙的写法
    Perl深拷贝
    Git diff hash顺序的问题
    perl命令行批量修改文件内容
    IOS写文件
    删除Linux乱码文件
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078016.html
Copyright © 2020-2023  润新知