本文共 2190 字,大约阅读时间需要 7 分钟。
本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分。所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏,发完牌之后需要对手上的牌进行排序,大家想想,麻将排序如何排呢?它有什么特点呢?而且在摸牌打牌的过程中,我们要不断的排序,如何排序呢?选择什么排序算法最快呢?
以上这种情况我们就可以分析选择哪种排序算法更高效。比如下图已经有一副固定顺序的牌了:
1、正常“3同”应该放到“2同”和”4同“中间。
2、跟其他花色的牌没有关系,甚至跟”5同“也没有关系。只需要把”3同“放到”2同“和”4同“中间就行。至于”2同”和”4同”在哪里不要紧。
我们前面学习了选择排序,如果使用选择排序对上面这副牌进行排序是否合适呢?显然是不合适的,因为选择排序必须从“七万”开始比较,选择最小牌跟头一张牌交换位置,依次类推。但是此处麻将牌的“3同”跟”七万“没有关系,不需要影响”7万“。所以使用选择排序不合适,因为时间负责度很高;此处使用插入排序会更好,什么是插入排序呢?就是本节需要介绍的内容。
插入排序属于简单排序的一种,通常指的简单排序只是因为其算法思路比较容易理解,不代表其用途很简单。为了让大家掌握插入排序,我们先看看插入排序的原理。
2.1、插入排序的原理
首先有一个待排序的数组如下:
1、先比较1和2,如果2比1小则交换位置。否则不交换位置。此数组不需要交换位置。
7、最后比较4和5,如果5比4小则交换位置,但是5比4大,所以位置不变。数组循环完毕,最终排序如下:
2.2、插入排序和选择排序的区别
比如就上面这个例子而言,插入排序是将0从索引为4的位置移动到索引3、2、1、0,最终才算结束。而选择排序是找到最小的值0,直接跟1进行交换,0到1的位置,1到0的位置。大家可以翻看前面关于选择排序的介绍。
以下是java代码的实现:
/**
以上是插入排序的java代码实现,代码中的第二个for循环是重点,第二个for循环是只比较当前数据左边的值,如果比左边的值小则交换位置,否则位置不变。
3.1 插入排序的时间复杂度
插入排序的时间复杂度有两种:
1、当数组本身是有序的,比如{1,2,3,4,5},则采用插入排序的时间复杂度是O(n)。原因:如果数组本身是有序,插入排序需要每两个挨着的数字进行比较一次,总共比较N-1次,所以时间复杂度是O(n)。
2、当数组是无序的,最坏的情况下需要比较(n2)/2次,所以时间复杂度是O(n2)。
根据插入排序的时间复杂度来看,插入排序适合如下类型的数组:
1、数组中的每一个元素距离其最终的位置都不远。比如{1,0,2,3,4,5},这个数组中0最终位置应该是头1个位置,0此时的位置距离1位置不远。
2、一个有序的大数组中融入一个小数组。比如有序大数组{1,2,3,4,5,6},融入一个小数组{0,1}。
3、数组中只有几个元素的位置不正确。
上述这三种情况的数组适合使用插入排序算法。打过麻将的同学想想,打麻将过程中不停地摸牌、打牌、整理牌的过程是不是就是一次插入排序呢!
排序是算法的基础,排序的用途很多。看完本节内容之后,大家不妨自己动手写个代码将无需的扑克牌进行排序,看更适合哪种排序算法。
本文来自,转载请注明出处。