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

我的Java开发学习之旅------Java经典排序算法之插入排序


一、算法原理

插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置。
假设我们输入的是 “53,27,36,15,69,  42” 我们从第二个数字开始,这个数字是27,我们的任务只要看看27有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较27和53,27比53小,所以我们就交换27和53,原来的排列就变成了“27, 53, 36, 15, 69, 42 ”
接下来,我们看第3个数字有没有在正确的位置。这个数字是36,它的左边数字是53,36比53小,所以我们将36和53交换,排列变成了 “27,36, 53, 15, 69, 42 "我们必须继续看36有没有在正确的位置,36的左边是27,27比36小,36就维持不动了,这时候排序还是27, 36, 53, 15, 69, 42 "
再来看第四个数字,这个数字是15,我们将15和它左边的数字相比,都比15大,所以就将15一路往左移动,这时候排序变成了 “15, 27, 36, 53, 69, 42 ”。
再来看第五个数字,这个数字是69,我们将69和它左边的数字相比,都比69小,所以就69维持不动了,这时候排序变成了 “15, 27, 36, 53, 69, 42 ”
最后,我们检查第六个数字,这个数字是42,42必须往左移,一直移到42的左边是36为止,所以我们的排列就变成了 “15, 27, 36, 42 ,53, 69”排序因此完成了。

ps:读者也可以自己打开下面的链接,自己设定要排序的数组,进行排序演练
直接插入排序动画演示(http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/insertsort.htm

所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。

二、算法描述

1、从第一个元素开始,该元素可以认为已经被排序。
2、取出下一个元素,在已经排序的元素序列中从后向前扫描。
3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。
4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。
5、将新元素插入到该位置。
6、重复步骤2。

三、效率分析


如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况如下。
最好情况:序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。
最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。
直接插入排序属于稳定的排序,最坏时间复杂度为O(n^2),最好时间复杂度为O(n),空间复杂度为O(1)。
插入排序的赋值操作是比较操作的次数加上(n-1)次。
因此,插入排序不适合对于数据量比较大的排序应用。


四、代码实现

public class InsertSortTest {
	public static void InsertSort(int[] source) {
		int i, j;
		int insertNode;// 要插入的数据
		// 从数组的第二个元素开始循环将数组中的元素插入
		for (i = 1; i < source.length; i++) {
			// 设置数组中的第2个元素为第一次循环要插入的数据
			insertNode = source[i];
			j = i - 1;
			// 如果要插入的元素小于第j个元素,就将第j个元素向后移
			while ((j >= 0) && insertNode < source[j]) {
				source[j + 1] = source[j];
				j--;  
			}
			// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
			source[j + 1] = insertNode;
			System.out.print("第" + i + "趟排序:");
			printArray(source);
		}
	}

	private static void printArray(int[] source) {
		for (int i = 0; i < source.length; i++) {
			System.out.print("\t" + source[i]);
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int source[] = new int[] { 53, 27, 36, 15, 69, 42 };
		System.out.print("初始关键字:");
		printArray(source);
		System.out.println("");
		InsertSort(source);

		System.out.print("\n\n排序后结果:");
		printArray(source);
	}

}



五、运行结果

初始关键字:      53	27	36	15	69	42

第1趟排序:	27	53	36	15	69	42
第2趟排序:	27	36	53	15	69	42
第3趟排序:	15	27	36	53	69	42
第4趟排序:	15	27	36	53	69	42
第5趟排序:	15	27	36	42	53	69


排序后结果:	15	27	36	42	53	69



==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================




转载于:https://www.cnblogs.com/ouyangpeng/p/8538084.html

相关文章:

  • POJ-3352 Road Construction(边双连通分量+缩点)
  • 445port入侵详细解释
  • UVALive-5013 Similarity(二分图最大权匹配)
  • Cisco ASA-ASA 8.2-L2L ***
  • HDU-3440 House Man(差分约束系统)
  • 怎么安装docker registry
  • HDU-3666 THE MATRIX PROBLEM(差分约束系统判断存在与否+特殊剪枝)
  • Thinkphp学习04
  • HDU-4315 Climbing the Hill(阶梯博弈变形)
  • HDU-5724 Chess(SG函数+状压)
  • Randy Shoup与Andrew Phillips对微服务方面问题的解答
  • HDU-4109 Instrction Arrangement(差分约束系统+增加源点技巧)
  • WiFi覆盖下的生活 享受便利的同时 别忘记了安全
  • HDU-6103 Kirinriki - 2017 Multi-University Training Contest - Team 6(尺取)
  • centos 记录用户行为轨迹
  • AngularJS指令开发(1)——参数详解
  • JavaScript DOM 10 - 滚动
  • JS变量作用域
  • Nacos系列:Nacos的Java SDK使用
  • react 代码优化(一) ——事件处理
  • Spring-boot 启动时碰到的错误
  • 汉诺塔算法
  • 面试总结JavaScript篇
  • 入门级的git使用指北
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 学习Vue.js的五个小例子
  • 硬币翻转问题,区间操作
  • 用Canvas画一棵二叉树
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​flutter 代码混淆
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)虚拟机的安装与使用,linux系统安装
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Java数据结构)ArrayList
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)认识微服务
  • (转)winform之ListView
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • . NET自动找可写目录
  • ./configure,make,make install的作用
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?