数据结构与算法-插入希尔归并

    一:排序引入

     我们通常从哪几个方面来分析一个排序算法?

        1.时间效率:决定了算法运行多久,O(1)

        2.空间复杂度:

        3.比较次数&交换次数:排序肯定会牵涉到两个操作,一个比较是肯定的。交换。

        4.稳定性:这是什么? 1 9 3 5 3

                第一种:1 3 3 5 9

                第二种:1 3 3 5 9  哪一种是稳定的?相同的两个数排完序后,相对位置不变。

        稳定排序有什么意义?应用在哪里呢?

                1.电商里面订单排序:首先会按金额从小到大排,金额相同的按下单时间。我从订单中心过来的时候已经按照时间排好序了。我选择排序算法:如果我选择不稳定的排序算法 那我还要比较两次的,如果我选择稳定的排序算法 那我就只要比较一个字段。

        二 核心思想:

        假设有个这样的问题:打扑克。分成两部分:一部分是你手里的牌(已经排好序),一部分是要拿的牌(无序)。

        把一个无序的数列一个个插入到有序数列中。 一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?我们只要遍历数组,找到数据应该插入的位置将其插入即可。

        三: 具体步骤

        1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素

        2.到未排序段取元素插入到已排序段,并保证插入后仍然有序

        3.重复执行上述操作,直到未排序段元素全部加完。

        四:举例:

        看以下这个例子:对7 8 9 0 4 3进行插入排序

        7 8 9 0 4 3

        7 8 9 0 4 3

        7 8 9 0 4 3

        0 7 8 9 4 3

        0 4 7 8 9 3

        0 3 4 7 8 9

        从以上操作中我们看到插入排序会经历一个元素的比较以及元素的移动。当我们从待排序列中取一个数插入到已排序区间时,需要拿它与已排序区间的数依次进行比较,直到找到合适的位置,然后还要将插入点之后的元素进行往后移动。

        五:插入排序代码实现、

package sort;/*** 插入排序*/
public class InsertionSort {/*** 1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素 2.到未排序段取元素插入到已排序段,并保证插入后仍然有序3.重复执行上述操作,直到未排序段元素全部加完。* * @param args*/public static void main(String[] args) {int a[] = { 9, 8, 7, 0, 1, 3, 2 };int n = a.length;//这里面会有几层循环 2//时间复杂度:n^2//最好的情况:什么情况下:O(n); O(1)//for(){		//分段for(int i = 1 ; i < n;i++){		//为什么i要从1开始? 第一个不用排序,我们就把数组从i分开,0~I的认为已经排好序int data = a[i];int j = i -1;for(;j>=0;j--){//从尾到头 1+2+3+4+5+...+n=>if(a[j] > data){a[j+1] = a[j];		// 数据往后移动}else{	//因为前面已经是排好序的 那么找到一个比他小的就不用找了,因为前面的肯定更小break; //O(1)		如果这个break执行的越多 那么我是不是效率就越高?}}	a[j+1] = data;System.out.print("第" +i +"次的排序结果为:");for(j = 0 ; j < n;j++){System.out.print(a[j]+" ");}System.out.println();}}}

        六:优化 (希尔排序==>插入排序改进版)

        希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

        先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  =1(  <  …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

来看一个具体的过程: 按照一个增量分段:add=n/2 n=10 =>5,2,1 7 8 9 0 4 3 1 2 5 10 我们取的这个增量分别就是5 2 1 7 8 9 0 4 3 1 2 5 10:分出来的数组元素都是一样的 完成一次排序: 3 1 2 0 4 7 8 9 5 3 2 4 8 5:取增量为2的分为一组了 最后一次我们就取增量为1的分组: 就是一个完整的序列,但是时间复杂度还是O(n^2)

        七:归并排序 (核心思想:递归+分治)

        主要分析时间复杂度:nlogn

        

package sort;import java.util.Arrays;public class MegrSort {public static void main(String[] args) {int data[] = { 9, 5, 6, 8, 0, 3, 7, 1 };//拆分megerSort(data, 0, data.length - 1);System.out.println(Arrays.toString(data));//JDK里面的排序源码}public static void megerSort(int data[], int left, int right) { // 数组的两端if (left < right) { // 相等了就表示只有一个数了 不用再拆了int mid = (left + right) / 2;//拆分从最左边到中间megerSort(data, left, mid);//拆分右边从中间+1到最右边megerSort(data, mid + 1, right);// 分完了 接下来就要进行合并,也就是我们递归里面归的过程meger(data, left, mid, right);}}public static void meger(int data[], int left, int mid, int right) {int temp[] = new int[data.length];		//借助一个临时数组用来保存合并的数据int point1 = left;		//表示的是左边的第一个数的位置int point2 = mid + 1;	//表示的是右边的第一个数的位置int loc = left;		//表示的是我们当前已经到了哪个位置了while(point1 <= mid && point2 <= right){if(data[point1] < data[point2]){temp[loc] = data[point1];point1 ++ ;loc ++ ;}else{temp[loc] = data[point2];point2 ++;loc ++ ;}}//接下来要干嘛呢?合并排序完成 了吗?while(point1 <= mid){temp[loc ++] = data[point1 ++];}while(point2 <= right){temp[loc ++] = data[point2 ++];}for(int i = left ; i <= right ; i++){data[i] = temp[i];}}
}

        这段代码实现了归并排序算法。归并排序是一种分治算法,它将一个数组分成两个子数组,分别对其进行递归排序,然后将两个有序的子数组合并成一个有序的数组。 代码中的megerSort方法是归并排序的主要方法,它接受一个数组和两个索引值作为参数,表示需要排序的数组和需要排序的范围。如果左索引小于右索引,则将数组分为两半,分别对左半部分和右半部分进行递归调用megerSort方法。递归调用结束后,再调用meger方法将两个有序的子数组合并成一个有序的数组。 meger方法创建了一个临时数组temp,用来保存合并的结果。变量point1point2分别表示左半部分和右半部分的起始位置。变量loc表示当前合并的位置。在循环中,比较左右两个子数组的元素大小,将较小的放入临时数组中,并将对应的指针向后移动。循环结束后,将剩余的元素依次放入临时数组中。最后,将临时数组的元素复制回原数组的对应位置。 整个归并排序的过程是递归的,每一次递归都会将数组分为两半,直到只有一个元素为止。然后通过合并两个有序的子数组来实现整个数组的排序。最后,通过递归调用megerSort方法将整个数组排序完成。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java elasticsearch scroll模板实现

一、scroll说明和使用场景 scroll的使用场景&#xff1a;大数据量的检索和操作 scroll顾名思义&#xff0c;就是游标的意思&#xff0c;核心的应用场景就是遍历 elasticsearch中的数据&#xff1b; 通常我们遍历数据采用的是分页&#xff0c;elastcisearch还支持from size的方…

mybatis-generator-maven-plugin使用

前提说明 数据库&#xff1a;MYSQL57Mybatis : http://mybatis.org/generator/index.html 操作说明 引入插件 <plugins><!-- MyBatis 逆向工程 插件 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generat…

汽车电子系统网络安全解决方案

声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全范围 本标准给出了汽车电子系统网络安全活动框架&#xff0c;以及在此框架下的汽车电子系统网络安全活动…

E5061B/是德科技keysight E5061B网络分析仪

181/2461/8938产品概述 是德科技E5061B(安捷伦)网络分析仪在从5 Hz到3 GHz的宽频率范围内提供通用的高性能网络分析。E5061B提供ENA系列常见的出色RF性能&#xff0c;还提供全面的LF(低频)网络测量能力&#xff1b;包括内置1 Mohm输入的增益相位测试端口。E5061B从低频到高频的…

Xcode打包ipa文件,查看app包内文件

1、Xcode发布ipa文件前&#xff0c;在info中打开如下两个选项&#xff0c;即可在手机上查看app包名文件夹下的文件及数据。

Tiny Player Mac:小而美,音乐播放的极致体验

对于追求音质和操作简便的Mac用户来说&#xff0c;Tiny Player Mac是一款不可多得的音乐播放器。它以简洁的界面、强大的功能和优异的性能&#xff0c;吸引了无数用户的目光。接下来&#xff0c;让我们一起了解这款小而美的音乐播放器。 Tiny Player Mac支持多种音频格式&#…

无需租云服务器,Linux本地搭建web服务,并内网穿透发布公网访问

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

Python Opencv实践 - 矩形轮廓绘制(直边矩形,最小外接矩形)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/stars.png") plt.imshow(img[:,:,::-1])img_gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) #通过cv.threshold转换为二值图 ret,thresh cv.threshold(img_gray,…

ToBeWritten之基于ATTCK的模拟攻击:闭环的防御与安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

从零开始探索C语言(三)----运算符和判断语句

文章目录 1. C 运算符1.1 算术运算符1.2 关系运算符1.3 逻辑运算符1.4 位运算符1.5 赋值运算符1.6 杂项运算符 ↦ sizeof & 三元1.7 C 中的运算符优先级 2. C 判断2.1 if 语句2.2 if...else 语句2.3 if...else if...else 语句2.4 ? : 运算符(三元运算符) 1. C 运算符 运算…

ChatGPT数据分析及作图插件推荐-Code Interpreter

今天打开chatGPT时发现一个重磅更新&#xff01;code interpreter插件可以使用了。 去查看openai官网&#xff0c;发现从2023.7.6号&#xff08;前天&#xff09;开始&#xff0c;code interpreter插件已经面向所有chatGPT plus用户开放了。 为什么说code interpreter插件是一…

422规范详解

概述&#xff1a; 全称为EIA-TIA-422-B&#xff0c;于1994年发布。 典型电路由一个发送器和N个接收器以及一个中断匹配电阻组成。 发送器&#xff1a; 差分输出电压值在2V~10V之间。 4.1.1 发送器输出阻抗 要求A/B之间的差分阻抗≤100Ω。 4.1.2 开路特性 要求差分电压≤…

在Cisco设备上配置接口速度和双工

默认情况下&#xff0c;思科交换机将自动协商速度和双工设置。将设备&#xff08;交换机、路由器或工作站&#xff09;连接到 Cisco 交换机上的端口时&#xff0c;将发生协商过程&#xff0c;设备将就传输参数达成一致&#xff0c;当今的大多数网络适配器都支持此功能。 在本文…

C++中的语法知识虚继承和虚基类

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类…

mac下配置JDK环境

一、下载安装 下载地址&#xff1a;Java Downloads | Oracle&#xff0c;选择适用于Mac OS的JDK版本&#xff0c;点击下载即可。 下载完之后&#xff0c;直接安装&#xff1a; 安装过程非常简单&#xff0c;按“继续”按钮一直下一步即可。 二、配置环境变量 上一步骤&#x…

深度刨析数据在内存中的存储

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 深度刨析数据在内存中的存储 1.数据类型介绍1.1 类型的基本归类 2.整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍 3.浮点型在内存中的存储3.1 一个例子3.2 浮点数的存储规则3.3指数…

matlab函数 状态空间系统ss、能控性矩阵ctrb、矩阵的秩rank、能控标准型canon、零极点配置place、系统极点pole等函数(线性定常系统)

matlab函数 能控性矩阵ctrb、能控标准型canon、零极点配置place 第一章&#xff0c;线性定常系统 ss 如果已知线性定常系统的ABCD四个矩阵&#xff0c;可以得到状态空间系统 其他更具体的用法请直接看帮助文档。 用法&#xff1a;ss(A,B,C,D) 假如 可以输入 A [-1.5,-2…

官方发布:Mac 版 Visual Studio IDE将于明年 8 月 31 日停止支持

近日&#xff0c;微软官方宣布&#xff1a;适用于 Mac 平台的 Visual Studio 集成开发环境&#xff08;IDE&#xff09;已经启动 "退休" 进程。Visual Studio for Mac 17.6 将继续支持 12 个月&#xff0c;持续到 2024 年 8 月 31 日。 微软表示在未来的 1 年内将重…

【AWS】如何用SSH连接aws上的EC2实例(虚拟机)?

目录 0.环境 1.连接结果示例 2.SSH连接思路 3.具体步骤 1&#xff09;安装并运行ssh服务 2&#xff09;启动ssh服务 3&#xff09;在AWS上找到正在运行的EC2实例&#xff0c;并且根据提供的ssh连接语句进行连接 0.环境 windows 11 64位 前提&#xff1a; 有aws账户&…

ios 运行ipa包 日志查看方式

方法一&#xff1a; 使用ideviceinstaller工具 # 安装ipa命令 brew install ideviceinstaller ideviceinstaller -i xxx.ipa# 查看运行日志 idevicesyslog# idevicesyslog 查找命令 idevicesyslog | grep test -A 3 -B 2 # 输出关键字所在行后3行&#xff0c;前2行) idevic…