当前位置: 首页 > article >正文

Java数据结构之《希尔排序》题目

一、前言:

  这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成的代码,重要的是理解它的算法原理!)

二、题目如下:

(第 5 题) 希尔排序(难度系数85)

希尔排序
描述

利用希尔排序算法实现线性表的排序。希尔排序是根据给定的增量序列将线性表分隔成某个“增量”的记录组成一个子序例,在子序列中采用直接插入排序完成

输入

第一行为元素个数n(1<=n<=1000),第二行为n个元素值(整数),即需要排序的元素个数,第三行增量序列中增量个数m,第四行为m个增量,可以假定最后一个增量为1。

输出

对每一测试用例,用m行输出各增量进行希尔排序结果,用空格隔开。

样例输入
10
49 38 65 97 76 13 27 49 55 4
3
5 3 1

样例输出

13 27 49 55 4 49 38 65 97 76
13 4 49 38 27 49 55 65 97 76
4 13 27 38 49 49 55 65 76 97

三、代码实现:(代码的做题原理全部在代码注释中,若还有疑问也可以翻书关于希尔排序的内容) 

(提示:相当于进阶版的直接插入排序,根据每次设定的增量,有一个增量区间,比较区间两头的元素,这个比较就是相当于插入排序了,再依次往后,直到第一次排序完。再接着下一个较小的增量继续划分区间......)

(1)创建Main类实现题目里面的所有希尔排序操作:

package com.fs.sort;
import java.util.Scanner;
public class Shell_Sort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();  //总共需要排序的元素个数
        int[] data = new int[n];  //放到一个数组里
        for (int i = 0; i < n; i++) {
            data[i] = sc.nextInt();
        }
        int m = sc.nextInt();  //代表跳跃时插入排序的跳跃增量
        int[] increment = new int[m];  //存入m个"增量"值
        for (int j = 0; j < m; j++) {
            increment[j] = sc.nextInt();
        }
        //接下来就要用从第一个增量开始,到最后一个增量的跳跃式插入排序
        for (int k = 0; k < m; k++) {
            int d = increment[k]; //每次跳跃时的增量
            for (int i = d; i < data.length; i++) {  //从每次增量下标的位置开始,每加一个就是下一个需要比较的区间
                if (data[i] < data[i - d]) {  //就是如果当前增量位置的元素,要小于当前位置减增量的小标的元素,要登记当前较小位置的元素
                    int temp = data[i];
                    int index = 0; //从最前面的元素作为一个有序区的第一个元素
                    for (index = i - d; (index >= 0) && (data[index] > temp); ) {  //只要前面的有序区元素大于后面的无序区元素,就要交换位置
                        data[index + d] = data[index];//将原来大的元素给放到原来小的元素的地方(注意是相差一个增量)
                        index = index - d;  //每次弄完就相当于把第一个有序区的第一个元素后移,不满足for循环,就退出,然后i会加1,这样就相当于后面一个增量区间的比较
                    }
                    //如果前面满足了,那么index-d的值会变成一个负数,所以要给原来增量区间的第一个值赋上较小值就要把下标加上d
                    data[index + d] = temp;
                }

            }
            //迭代器依次输出
            for (Integer data01 : data) {
                System.out.print(data01+" ");
            }
            System.out.println();
        }
    }
}

四、不同情况的代码测试运行结果:

<1>首先是题目中的测试输入样例:(最好手打输入测试,直接复制可能格式问题导致报错!)

<2>其他测试: 

11
70 30 40 10 80 20 90 100 75 60 45
3
3 2 1


http://www.kler.cn/a/154545.html

相关文章:

  • 力扣刷题日记之150.逆波兰表达式求值
  • candence : 通孔焊盘、插装器件封装绘制
  • WebChromeClient 方法分类及其功能
  • Swift的可选绑定(Optional binding)
  • 【星海随笔】ZooKeeper-Mesos
  • Ubuntu 18 EDK2 环境编译
  • 代码随想录算法训练营第39天| 62.不同路径 63. 不同路径 II
  • 吉他初学者学习网站搭建系列(4)——如何查询和弦图
  • NacosSync 用户手册
  • 苍穹外卖——删除购物车信息
  • Java流Stream使用详解(下)
  • 【JavaSE】API(学习笔记)
  • 【Unity】Blender场景导入
  • Azure Machine Learning - 在 Azure AI 搜索中创建全文查询
  • mac修改默认shell为bash
  • 转载:利用Flask实现深度学习模型部署
  • 【C++干货铺】继承 | 多继承 | 虚继承
  • Mybatis-Plus实现乐观锁
  • TCA9548A I2C 多路复用器 Arduino 使用相同地址 I2C 设备
  • 【Pytorch 入门】DAY 4 损失函数 模型的保存与下载
  • 第十一节HarmonyOS 常用容器组件1-Row与Column
  • Linux的基本指令(五)
  • 【ArcGIS Pro微课1000例】0039:制作全球任意经纬网的两种方式
  • 为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)
  • springboot数据格式验证——自定义日期格式验证及list验证
  • 大数据湖项目建设方案:文档全文101页,附下载