java 实现 常见排序算法(二) 插入排序

大家好,我是烤鸭:    

   今天分享一下基础排序算法之直接插入排序。

 

1.     直接插入排序:

原理:假设前面的数为有序数列,然后有序数列与无序数列的每个数比较,我们可以从右向左比较

思路:从第2个数开始,和1比较。这样前2个有序。

           第3个和前2个比较,这样前3个有序。(如果是最小的,则第3个元素处在第1个位置,后面的元素后移1。)

           第4个和前3个比较,同上。

           直到第 n 个元素 和 前 n-1 个比较。

代码实现:

    /*** 直接插入排序* directInsertSort** @param array 时间复杂度,O的n^2* 直接插入排序就是我们假设前面的数为有序数列,然后有序数列与无序数列的每个数比较,我们可以从右向左比较* 当 array[i]<=array[j]=*/public void directInsertSort(int[] array) {long nowTime = System.currentTimeMillis();int tem = 0;for (int i = 1; i < array.length; i++) {int j = i - 1;tem = array[i];for (; j >= 0 && array[j] > tem; j--) {array[j + 1] = array[j];//将大于array[i]的数整体后移一单位}array[j + 1] = tem;}System.out.println("直接插入排序,花费时间(s):" + ((System.currentTimeMillis() - nowTime) / 1000.0) + "s");}

2.     折半插入排序(优化):

思路:

其实和直接插入排序是类似的,只是在遍历元素的时候采用的是二分法,直插采用的是顺序遍历。

取 temp 作为当前元素,

begin从0开始,end到数组最后一个元素。

如果temp < 中间值,begin从中间值+1继续,否则 end 变为 end - 1 继续,

begin 到 i 整体后移。

如图:(图片来源 http://www.cnblogs.com/chengxiao/p/6103002.html)

代码实现:

/*** 折半插入排序* @param source* halfInsertSort** @param source 时间复杂度,O的n^2* 折半插入排序算法是一种稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,* 因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n^2),* 与直接插入排序算法相同*/public static void halfInsertSort(int[] source) {long nowTime = System.currentTimeMillis();int size = source.length;for (int i = 1; i < size; i++) {// 拿出来int temp = source[i];int begin = 0; // 标记排好序的数组的头部int end = i - 1; // 标记排好序数组的尾部// 只要头部一直小于尾部,说明temp还在2个标记范围内while (begin <= end) {// 取2个标记的中间数据的值int mid = (begin + end) / 2;// 比较,若比中间值大,则范围缩小一半if (temp > source[mid]) {begin = mid + 1;// 否则,范围也是缩小一半} else {end = mid - 1;}// 循环结束时,end<begin,即i应该插入到begin所在的索引}// 从begin到i,集体后移for (int j = i; j > begin; j--) {source[j] = source[j - 1];}// 插入isource[begin] = temp;}System.out.println("折半插入排序,花费时间(s):" + ((System.currentTimeMillis() - nowTime) / 1000.0) + "s");}

3.     shell排序

思路:

Shell排序也是对直接插入排序的改进。它实质上是一种分组插入方法。

下面希尔排序的步长选择都是从n/2开始,每次再减半,直到最后为1。

时间复杂度 : O(nlog2^n)

 /*** 希尔排序* 针对直接插入排序的下效率问题,有人对次进行了改进与升级,这就是现在的希尔排序。* 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。* 首先确定分的组数。* 然后对组中元素进行插入排序。* 然后将length/2,重复1,2步,直到length=0为止。* @param arr*/public void shellSort(int [] arr){long nowTime = System.currentTimeMillis();int len=arr.length;//单独把数组长度拿出来,提高效率while(len!=0){len=len/2;for(int i=0;i<len;i++){//分组for(int j=i+len;j<arr.length;j+=len){//元素从第二个开始int k=j-len;//k为有序序列最后一位的位数int temp=arr[j];//要插入的元素/*for(;k>=0&&temp<arr[k];k-=len){arr[k+len]=arr[k];}*/while(k>=0&&temp<arr[k]){//从后往前遍历arr[k+len]=arr[k];k-=len;//向后移动len位}arr[k+len]=temp;}}}System.out.println("希尔排序,花费时间(s):" + ((System.currentTimeMillis() - nowTime) / 1000.0) + "s");}

 

耗时对比:

10W 条随机 数据 运行如图:

可以看出希尔排序时间明显(比直插排序和折半排序)缩短。折半排序和直插排序时间差不多。

50W 条随机 数据 运行如图:

可以看出希尔排序时间明显(比直插排序和折半排序)缩短。折半排序和直插排序时间差不多。

100W 条随机 数据 运行如图:

可以看出希尔排序时间明显(比直插排序和折半排序)缩短。折半排序比直插排序耗时更多。

总结:

直接插入排序写法比较简单,平均时间复杂度为:O(n^2) 。

折半插入排序,平均时间复杂度为:O(n^2) 。

希尔排序,平均时间复杂度为:O(nlog2^n) 。

各种排序方法比较:

 

更多排序算法:

冒泡排序   :  https://blog.csdn.net/Angry_Mills/article/details/81057900

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

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

相关文章

[css] css中的border:none和border:0px有什么区别?

[css] css中的border:none和border:0px有什么区别&#xff1f; none是没有边框. 0px是边框的宽度为0px.个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux 常用 启动命令 汇总

大家好&#xff0c;我是烤鸭&#xff1a; 没有准备启动脚本。服务器出问题之后&#xff0c;重启就是全部重启。 如&#xff1a; mysql,nginx,tomcat,zookeeper,rabbitmq,mongodb,redis,xxxxx 头大。持续更新。。。 consul启动&#xff1a; (公网可以访问 使用-client 0.0.0…

Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg

由于一次电脑蓝屏&#xff0c;Idea启动tomcat报错: Error:Artifact :war exploded’: java.nio.file.InvalidPathException: Illegal char < > at index 71: K:\COMPANY_CODE_IDEA\FLOW_CODE*\target\activ : Illegal char < > at index 71: K:\COMPANY_CODE_IDEA…

[css] 如何写高效的CSS?

[css] 如何写高效的CSS&#xff1f; 唔&#xff0c;自动补全、预编译这些辅助手段确实能提升一定的效率&#xff0c; 但我觉得真正能提升效率的是&#xff0c;不看预览就敢上手的理论知识。 见过太多加几行就要预览下效果的开发了&#xff0c;哪怕给他双屏其实也还是会拖慢节奏…

React 在body上绑定事件以及阻止事件冒泡

<!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>React 在body上绑定事件以及阻止事件冒泡</title><script src"https://unpkg.com/react16/umd/react.development.js"></script><script …

[css] 如何做图片预览,如何放大一个图片?

[css] 如何做图片预览&#xff0c;如何放大一个图片&#xff1f; 图片不跨域的话用 canvas 来 drawImage 放大裁剪也可以。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前…

java 爬虫 抓取 网易云音乐

大家好&#xff0c;我是烤鸭&#xff1a; 今天和大家交流一下爬虫&#xff0c;抓取网易云音乐。只讨论技术&#xff0c;不提倡其他的。 1. 找音乐源地址 谷歌浏览器 F12 &#xff0c;找请求类型是 Media的。 2. 找请求链接 切换请求类型到 All&#xff0c;看 Respons…

idea警告Cannot resolve MVC View

关闭MVC View路径检查,Settings --> Editor -->Inspections -->搜索Spring MVC View—>取消勾选Spring MVC View Reference

[css] 举例说明在css3中怎么实现背景裁剪?

[css] 举例说明在css3中怎么实现背景裁剪&#xff1f; background-clip: border-box(默认,背景延伸至边框外沿,但是在边框的下层) padding-box(背景延伸至padding的外沿) content-box(背景延伸至内容的外沿) text(背景剪裁成文字的样式)个人简介 我是歌谣&#xff0c;欢迎和大…

django 模型类的常见字段约束,以及filter 过滤和查询

null 不设置时默认设置为False。设置为True时&#xff0c;数据库表字段中将存入NULL的记录。 null和blank组合使用&#xff0c;nullTrue,blankTrue,表示该字段可以为空 blank 默认设置为False。设置为True时&#xff0c;表字段许可无任何输入。设置为False 时&#xff0c;表字段…

idea启动tomcat时蓝屏

idea启动tomcat时蓝屏 环境 1&#xff0c;windows10 2&#xff0c;tomcat8 3&#xff0c;jdk8 4&#xff0c;idea2020 解决方法&#xff1a; 因为之前安装的是绿色版jdk&#xff0c;然后再官网下载exe格式的jdk&#xff0c;idea再更换一下jdk就没有蓝屏了&#xff01; jdk8下…

ssh sftp 免密码 公钥登录

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享的是java ssh sftp 免密码登录。 1. JAVA代码 ssh连接 http://www.360doc.com/content/14/0409/16/9552892_367544139.shtml https://blog.csdn.net/u013066244/article/details/70198839 公钥和私钥不需要用代码生成&…

[css] 如何使用CSS的多列布局?

[css] 如何使用CSS的多列布局&#xff1f; div {-webkit-column-count: 3; /* Chrome, Safari, Opera */-moz-column-count: 3; /* Firefox */column-count: 3; }或者使用flex布局来实现多列布局个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&…

CF989E A Trance of Nightfall(概率+矩阵快速幂优化+倍增)

CF传送门 洛谷传送门 【题目分析】 在zxy大佬的讲解下终于懂了这道题的做法了qwq。。。 首先根据题意&#xff0c;出发点不一定在特殊点上&#xff0c;但第一次操作后&#xff0c;之后所有的操作都是在特殊点上&#xff0c;所以先考虑从线上出发的最大概率&#xff0c;再加一步…

linux centos/redhat mysql8.0安装(汇总贴)

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下linux 装 mysql8.0。以下都是实践过的可以用的。 1. yum方式安装&#xff08;最简单方式&#xff09; https://blog.csdn.net/weixin_37264997/article/details/80342838 2. linux系统安装mysql8.0.11完整教程&#xff…

[css] 请说说CSS3实现文本效果的属性有哪些?

[css] 请说说CSS3实现文本效果的属性有哪些&#xff1f; text-shadow:文字阴影效果 word-wrap:换行设置个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

SqlServer自定义聚合函数

sqlserver2017版本包括以上的可以使用string_agg(字段,’,’)函数 sqlserver查询版本&#xff1a; select versionSql Server自定义聚合函数详细bai步骤 开始-> 输出-> 首先用baiVS2008/VS2005建立一个SQL Server项目&#xff0c;右键解决方案添加新项 点击“确定…

C#前后端操作json数据

一、前端代码&#xff1a; function initDeptSelect() {var datas {"plant":$(#plantSelect).val()}; //获取某个组件的值&#xff0c;以json格式形式存放var jsonVal JSON.stringify(datas);//将值转化为json对象&#xff0c;必须要做$.ajax({type: post, …

[css] 请说说在什么时候用transition?什么时候使用animation?

[css] 请说说在什么时候用transition&#xff1f;什么时候使用animation&#xff1f; transition 相当于是个过度动画&#xff0c;需要又过度效果才会触发。一般用来做元素的放大缩小、平移旋转等简单的操作。transition 只执行一次&#xff0c;当需要执行多次时&#xff0c;一…

springboot : Failed to decode downloaded font 和 OTS parsing error

大家好&#xff0c;我是烤鸭&#xff1a; 采坑实录&#xff0c;看了很多人跟我有类似问题&#xff0c;但是都没解决我的问题&#xff1a; Failed to decode downloaded font 和 OTS parsing error: 尝试了把woff文件移动到其他可以加载的静态资源文件夹下&#xff0c;还是无法…