排序-InsertionSort 插入排序
插入排序 の implementation
插入排序就像打赌的时候,比如双扣。抽牌的时候,一次拿一张牌,这张牌和之前的牌一张张比较。选择把这张牌插入什么位置,排好顺序的位置后打牌更顺。要不然得一个一个找到时麻烦。也不利于打牌的大局观。看下图
假设第一次抽到梅花7, 不用排序。因为只有一张
接着抽到梅花10
。因为10比7大,所以不用排序。
再接着抽卡。发现抽到了梅花5
。这个时候不要犹豫,2点真的不算大的。果断弃牌
接着我们拿 5 和 10 比较。 5 小于 10 所以交换位置。
拿5再和7比。 5 比 7 小。 所以交换 5 和 7 的位置 得到
。
这个时候就已经是sorted的了。 原理就是这样子。
因为比较简单。直接贴上代码
// O(n^2) 最坏的情况
// 最好的情况 O(n)
public static void sort(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
for (int j = i ; j > 0; j--) {
if (less(a[j], a[j - 1]))
exch(a, j, j - 1);
else
break;
}
}
} public static void sort(Comparable[] a, int low, int hi) {
for (int i = low; i <= hi ; i++) {
for (int j = i ; j > low; j--) {
if (less(a[j], a[j - 1]))
exch(a, j, j - 1);
else
break;
}
}
}
InsertSort
完整的代码在https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/InsertionSort.java
性能分析
最坏的情况就是每次抽到的卡是最小的。这个时候每次都需要从尾部遍历到头部。时间是N ^ 2成正比
最好的情况就是已经排好序了。因为已经排好序了。所以每次抽到的牌都不需要排序。 时间是 N 成正比
排序-InsertionSort 插入排序的更多相关文章
- python排序之一插入排序
python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果, ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- JavaScript算法(冒泡排序、选择排序与插入排序)
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- Java选择排序,插入排序,快速排序
public class Test { public static void main(String[] args) { int a[] = { 1, 2, 3, 4, 5 }; 选择排序(a); ...
- 数据结构和算法(Golang实现)(21)排序算法-插入排序
插入排序 插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序.就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复. 插入排序属于插入类排序算法. 除了我以外,有些人打扑 ...
随机推荐
- 微信小程序新闻网站列表页
在app.json中可以设置所有文件的头部导航颜色 (是window属性的子属性) 在具体页面可以单独设置该页面的导航颜色 (直接写该属性,不需要写window属性) 查看官方文档,可以看到好多全局属 ...
- 别走!这里有个笔记:图文讲解 AQS ,一起看看 AQS 的源码……(图文较长)
前言 AbstractQueuedSynchronizer 抽象队列同步器,简称 AQS .是在 JUC 包下面一个非常重要的基础组件,JUC 包下面的并发锁 ReentrantLock CountD ...
- ATcoder Grand Contest总结
最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...
- canvas基础[二]教你编写贝塞尔曲线工具
贝塞尔曲线 bezierCurveTo 在线工具 https://canvature.appspot.com/ [感觉这个好用一些] https://blogs.sitepointstatic.com ...
- tcp 客户端 synack的接收 以及 相互connect
接收入口 tcp_v4_rcv |--> tcp_v4_do_rcv |-> tcp_rcv_state_process ...
- struts2中数据的传输
1.传统的写多个request接受参数方法. 2.struts2中的多个setter方法,getter方法 3.利用实体bean,让strut2 实例bean,少写setter方法,getter方法, ...
- 【javascript】掌握ES6-10,附xmind思维导图,每个知识点备注说明案例,请享用
前段时间一直想掌握ES6-10,陆陆续续花了1个月的时间,自学了ES6-10的新知识点,大部分都是非常实用的,花了2天时间整理思维导图 思维导图已上传博客园,请享用. ES6-10思维导图xmind ...
- 内存使用过高点检checklist
正在运行的程序按照内存段来组织,内存段的类型有如下几种: 代码段:用户程序指令,长期存在内存中 数据段:全局变量等,长期存在内存中 堆:局部变量,参数参数等,短期存在内存中 栈:动态存储,可变 代码段 ...
- redis源码学习之slowlog
目录 背景 环境说明 redis执行命令流程 记录slowlog源码分析 制造一条slowlog slowlog分析 1.slowlog如何开启 2.slowlog数量限制 3.slowlog中的耗时 ...
- C#设计模式——代理模式(Proxy Pattern)
引言 在我们的生活中,经常会遇到需要什么东西,但是自己又不是很方便或者对方不是很方便,则就需要中间的一个代理人去解决.例如代购.在软件开发中,也会遇到这样的问题.有些对象有时候会由于网络或其他的障碍, ...