数据结构与算法-希尔排序、归并排序

news2024/11/16 23:49:04

目录​​​​​​​

希尔排序

1.算法描述

 2.算法的实现

归并排序

4.1算法描述

2.算法实现


希尔排序

1.算法描述

1959年shell发明,第一批突破O(n2)时间复杂度的排序算法,是简单插入排序的改进版。它与插入之处在于,它会优先于举例比较远的元素。希尔排序又叫 缩小增量排序

算法的核心思想是将整个待排序的记录序列分割为若干个子序列分别进行直接插入排序,具体算法描述:

1.先根据数组的长度/n,获得增量K(第一次n为2)

2.按增量序列个数k进行分组,一般可以分为k组;

3.根据已分好的组进行插入排序;(每组排序,根据对应的增量来找当前组的元素)

4.当每组排序完毕之后,回到第一步将n*2再次分组进行插入排序,直到最终k=1的时候,在执行一次插入排序完成最终的插入排序。

 2.算法的实现

分解1:先将数组根据长度分为length/2(增量),并将第一组的元素进行插入排序

分解2:排序完毕之后,将n*2再次分组进行插入排序

分解3:执行完第一轮之后,再继续分组执行分解1和分解2的操作,最终到无法分组,排序完成

法1:

package Sort;

public class ShellSort {
    public static void main(String[] args) {
        int[] arrs={8,6,12,7,2,5,4,1,9,3};
        //分组
        int group=arrs.length/2;
        while (group!=1){
            //分组
            group=group/2;
          //  System.out.println("输出第一组的元素");
            for (int i = 0; i < group; i++) {
                int j=i;
                while(j+group<arrs.length){
                    int insert=j+group;
                    while ((insert-group) >= 0){
                        if(arrs[insert-group]>arrs[insert]){
                            //进行交换
                            int temp=arrs[insert-group];
                            arrs[insert-group]=arrs[insert];
                            arrs[insert]=temp;
                            //插入的指针要向前移动
                            insert=insert-group;
                        }else{
                            break;
                        }
                    }
                    //j进行增量
                    j=j+group;
                }
            }
        }


        for(int i=0;i<arrs.length;i++){
            System.out.println(arrs[i]);
        }



    }
}

法二: 

package Sort;

public class text {
    public static void main(String[] args) {
        int[] arrs ={8,6,1,7,2,5,4,12,9};
        //希尔排序
        for(int gap=arrs.length/2; gap >0; gap/=2){

            //插入排序
            for(int i=gap;i<arrs.length;i++){
                int insert = arrs[i];
                int p=i;
                while (p-gap >= 0 && arrs[p-gap] > insert){
                    arrs[p]=arrs[p-gap];
                    p-=gap;
                }
                arrs[p]=insert;
            }
        }
        //输出结果
        for(int i = 0; i < arrs.length;i++){
            System.out.println(arrs[i]+",");
        }
    }
        }

归并排序

4.1算法描述

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略即将问题分成一些小的问题然后递归求解,而治的阶段将得分的阶段得到的答案“修补”在一起,及分而治之。

归并排序是稳定排序,它也是一种十分高效的排序,能利用二叉树特性的排序一般性能都不会太差。java中Array.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可以看出,每次合并操作平均时间复杂度为O(n),而完全二叉树的深度为|nlogn|。并且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
 

 归并排序的核心思想是先分再治,具体算法描述如下:

1.先将未排序数组/2进行分组,然后再将分好组的数组继续/2再次分组,直到无法分组,这个就是分的过程。

2.然后再把两个数组大小为1的合并成大小为2的,再把两个大小为2的合并成4的,同时在合并过程中完成数组的排序,最终直到全部小的数组合并起来,这个就是治的过程。

 治的过程中会分为两个驻足两个游标,和一个新的数组。

1.分别比较两个游标对应的数组的元素,将小的插入到新的数组中

2.然后向后移动较小的数组的游标,继续进行比较

3.反复前面两步,最终将两个数组的元素合并到新的数组中

2.算法实现

分解1:先实现分的思想,讲数组分解进行实现

1.先获取数组的中轴,然后以中轴讲数组分为两个部分

2.使用递归分别执行两部分分解

分解2:实现具体治的过程,讲左右两个数组合并到一个临时数组中

1.分别设计两指针i和j,遍历左右两个数组,取出元素进行比较,将小的元素放到临时数组中

2.然后将左右剩下的元素放到数组中

3.将排序好的数组中的元素返回到未排序的数组中

package Sort;

public class MergeSort {


    public static void main(String[] args) {
        int[] arrs = {8, 6, 1, 7, 2, 5, 4, 12, 9};
        //归并函数
        mergesort(arrs, 0, arrs.length - 1);
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]);
        }
    }

    //实现归并排序
    public static void mergesort(int arrs[], int start, int end) {
        if (start < end) {
            int mid = (start + end) / 2;
            mergesort(arrs, start, mid);
            mergesort(arrs, mid + 1,  end);

            //治的过程,实现插入并完成
            int[] temp = new int[end + 1];
            int left = start;//左边数组的指针
            int right = mid + 1;//右边数组的指针
            int p = 0;//临时数组的指针
            //遍历左右两个数组,将较小的元素插入到临时数组中
            while (left <= mid && right <= end) {
                if (arrs[left] <= arrs[right]) {
                    temp[p++] = arrs[left++];
                } else {
                    temp[p++] = arrs[right++];
                }
            }
            //再将左右剩余的元素插入的临时数组中
            while (left <= mid) {
                temp[p++] = arrs[left++];
            }
            while (right <= end) {
                temp[p++] = arrs[right++];
            }

            //将p重置
            p = 0;
            while (start <= end) {
                arrs[start++] = temp[p++];
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 深入系统完全讲解(二)

操作系统 操作系统是一套软件&#xff0c;它的任务就是为上层开发的用户&#xff0c;提供一个更方便的开发环境&#xff0c;同时 让硬件连接到系统中&#xff0c;能够非常方便&#xff0c;从而提高开发速度&#xff0c;以及稳定可靠。 操作系统就是这么存在的。 我们理解它&am…

基于低代码平台构筑金融行业IT运维服务体系

我今天分享题目是《基于低代码平台&#xff0c;构筑金融行业的IT运维服务体系》。这是一个大家不太熟悉的领域&#xff0c;首先它的行业是金融&#xff0c;其次它做的事情是IT运维。 关于金科信息 我先介绍一下金科信息。金科信息在1993年成立&#xff0c;到明年我们就整整30…

前端开发技术栈(插件篇):datatables

一、Datatables介绍 官网地址&#xff1a;https://datatables.net/ DataTables中文网&#xff1a;http://datatables.club/ 1、Datatables是一款jquery表格插件。它是一个高度灵活的工具&#xff0c;可以将任何HTML表格添加高级的交互功能。 2、分页&#xff0c;即时搜索和排序…

【Bootstrap】可复用的组件

目录 一、字体图标 二、下拉菜单 1. 步骤 2. 对齐 3. 分割线 4. 禁用的菜单项 三、按钮组 1. 按钮组 2. 按钮工具栏 3. 尺寸 4. 嵌套 5. 垂直排列 四、输入框组 1. 输入框组 2. 尺寸 3. 作为额外元素的按钮 4. 作为额外元素的按钮式下拉菜单 一、字体图标 组件…

55、MySOL数据库

目录 一、MySQL安装和配置 二、数据库 三、表 四、数据库的C [create] R [read] U [update] D [delete] 语句 1、insert语句 2、update语句 3、delete语句 4、select语句 五、Mysql常用数据类型&#xff08;列类型&#xff09;&#xff1a;​编辑 六、函数 *合计 / 统计…

kettle - 清洗 mongodb 数据案例

文章目录前言kettle - 清洗 mongodb 数据案例一、需求二、kettle开发1、新建mongodb数据查询2、配置kettleTest集合与清洗后kettleTestClear集合字段映射3、根据_id进行排序4、使用java脚本将日期格式化5、进行字段选择6、将delete字段进行值映射7、mongo输出8、最后加一个写日…

详解哨兵之间是如何通信的

基于 pub/sub 机制的哨兵集群组成 哨兵实例之间可以相互发现&#xff0c;要归功于 Redis 提供的 pub/sub 机制&#xff0c;也就是发布 / 订阅机制。 哨兵只要和主库建立起了连接&#xff0c;就可以在主库上发布消息了&#xff0c;比如说发布它自己的连接信息&#xff08;IP 和…

PDF如何转换成PPT?教你们几个简单方法

我们在工作经常用PDF文件进行传输&#xff0c;因为PDF体积小&#xff0c;传输速度很快&#xff0c;还不会不同设备上出现不兼容的问题&#xff0c;可以很好的保持文件的排版&#xff0c;不过我们有时候需要进行文件的展示&#xff0c;所以需要将PDF文件转换为PPT文件&#xff0…

2023河南/北京/重庆/南京DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

论文阅读——Recognizing Emotion Cause in Conversations

文章目录摘要引言相关工作任务定义构造RECCON数据集情绪原因的类型实验任务1&#xff1a;Causal Span Extraction模型任务2&#xff1a;Causal Emotion Entailment模型面临的挑战摘要 识别文本中情绪背后的原因是NLP中一个未被探索的研究领域。这个领域的发展具有着改善情感模…

Docker基础1-3

Docker基础1-3 时间:2023-01-02 https://www.bilibili.com/video/BV1gr4y1U7CY/ xmind文档&#xff1a;https://www.aliyundrive.com/s/6iaQt9zLDVm 一、Docker简介 1、Docker解决了什么问题 Docker打破了过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外&am…

LeetCode:15. 三数之和

15. 三数之和1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] …

【Nginx】核心配置文件结构

文章目录Nginx核心配置文件结构全局块user指令work process指令其他指令events块events指令配置实例http块定义MIME-Type自定义服务日志其他配置指令server块和location块Nginx服务器基础配置实例Nginx核心配置文件结构 从前面的内容学习中&#xff0c;我们知道Nginx的核心配置…

给力!低代码开发平台广州流辰信息科技助您增辉创价值!

低代码平台开发公司流辰信息深耕行业多年&#xff0c;一直以市场为导向&#xff0c;凭借敏锐的市场洞察力砥砺前行、拼搏进取&#xff0c;提升研发创新能力&#xff0c;广州流辰信息科技与各新老客户朋友风雨同舟&#xff0c;携手共创宏伟新蓝图&#xff01; 一、熔铸前沿科技 …

kettle的安装以及注意(迭代中....)

1、下载 kettle的官网下载地址&#xff1a;Pentaho from Hitachi Vantara - Browse Files at SourceForge.net 如果需要下载其他版本&#xff1a; 直接点击对应的版本Name&#xff08;8.0以下的实在Data Integration文件夹里面&#xff09;进去&#xff0c;再选择client-too…

【C++】代码调试的学习笔记

1. IO输出调试&#xff1a;输出重定向 在《第八期-C基础与深度解析》课程中&#xff0c;老师使用了“输出重定向”的语句来查看cout和cerr的结果&#xff1a; ./HelloWorld >txt1 2>txt2 代码含义&#xff1a;将程序HelloWorld的标准输出stdout重定向至文件txt1&#xf…

百趣代谢组学分享:从SWATH到MRM:一种新型高覆盖度靶向代谢组学技术

百趣代谢组学文献分享&#xff0c;SWATHtoMRM: Development of High-Coverage Targeted Metabolomics Method Using SWATH Technology for Biomarker Discovery&#xff0c;是由中国科学院生物与化学交叉研究中心&#xff0c;Dr. Zheng-Jiang Zhu课题组发表在AC上的一篇技术型文…

verilog学习笔记- 3)SignalTap II 软件的使用

目录 SignalTap II简介&#xff1a; SignalTap II使用&#xff1a; SignalTap II简介&#xff1a; SignalTap II 全称 SignalTap II Logic Analyzer&#xff0c;是第二代系统级调试工具&#xff0c;可以捕获和显示实时信号&#xff0c;是 一款功能强大且极具实用性的 FPGA 片…

IO模型详解

什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll跟IO模型有什么关系?有几种经典IO模型呢?BIO、NIO、AIO到底有什么区别的? 什么是IO呢? IO,英文全称是Input/Output,翻译过来就是输入/输出。平时我们听得挺多,就是什么磁盘IO,网络I…