• 排序算法Java代码实现(三)—— 插入排序 和 希尔排序


    因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录

    本篇内容:

    • 插入排序
    • 希尔排序

    (一)插入排序

    算法思想:

    把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;

    排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。

    代码实现:

    (注意:ArrayBase在第一篇中已给出代码)

    /**
     * 
     */
    package com.cherish.SortingAlgorithm;
    
    /**
     * @author acer
     *
     */
    public class Chapter_3_插入排序 extends ArrayBase {
    
        /**
         * 
         */
        public Chapter_3_插入排序() {
            // TODO 自动生成的构造函数存根
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            int[] array = new int[] {3,4,7,9,2,5,1,8,6};
            printArray(array);
            insertSorting(array);
            printArray(array);
        }
        
        /*
         * 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;
         * 排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。
         * */
        public static void insertSorting(int[] array) {
            // TODO 自动生成的方法存根
            int arrayLength = array.length;
            for(int i = 1 ; i < arrayLength ; i++)
            {
                for(int j = i ; j > 0;j--)
                {
                    if(array[j]<array[j-1])
                    {
                        swap(array,j,j-1);
                    }
                    
                }
                printArray(array);
            }
        }
    }

    实现结果:

    (二)希尔排序

     算法思想:

    希尔排序的实质就是分组插入排序,又称缩小增量法;

    将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,

    然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。

    因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高

    /**
     * 
     */
    package com.cherish.SortingAlgorithm;
    
    /**
     * @author acer
     *
     */
    public class Chapter_4_希尔排序 extends ArrayBase {
    
        /**
         * 
         */
        public Chapter_4_希尔排序() {
            // TODO 自动生成的构造函数存根
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            int[] array = new int[] {3,4,7,9,2,5,1,8,6};
            printArray(array);
            shellSorting(array);
            printArray(array);        
        }
        
        
        /*
         * 希尔排序的实质就是分组插入排序,又称缩小增量法
         * 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,
         * 然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。
         * 因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高
         * */
        public static void shellSorting(int[] array)
        {
            int arrayLength = array.length;//数组长度
            int gap = arrayLength/2;//子序列数
            while(gap>=1)
            {
                for(int i = gap;i < arrayLength;i++)
                {
                //    int j=i-gap;
                    for(int j = i-gap;j>=0;j--)
                    {
                        if(array[j]>array[i])
                        {
                            swap(array,j,i);
                        }    
                    }                            
                }
                gap = gap/2;
                printArray(array);
            }
        }
    }

    实现结果:

  • 相关阅读:
    matlab练习程序(连续系统辨识与响应)
    【转】灵敏度可以是负值吗_【技术指南】 精确度,准确度,分辨率和灵敏度
    XStream升级1.4.18问题 规格严格
    基于Flink的网络流量实时解析 规格严格
    Maven构建时报错,File encoding has not been set, using platform encoding GBK解决方法 规格严格
    Spring Boot动态修改日志级别 规格严格
    内存分析工具 规格严格
    ES5.6.12客户端连接报错Caused by: java.lang.ClassNotFoundException: org.elasticsearch.http.AbstractHttpServe 规格严格
    动态调整日志等级 规格严格
    时序数据库存储初识1 规格严格
  • 原文地址:https://www.cnblogs.com/CherishTheYouth/p/CherishTheYouth_2019_0811_insertAndShell.html
Copyright © 2020-2023  润新知