扑克牌相信大家都有玩过,直接插入排序和玩扑克牌很相似,右手抓取一张扑克牌,并把它插入左手拿着的排好序的扑克里面。
如图:
算法介绍:
直接插入排序算法是最简单的算法,也是最基本的算法。SO,插入排序就是把当前待排序的元素插入到一个已经排好序的列表里面。
插入排序的最坏运行时间是O(n2), 所以并不是最优的排序算法。特点是简单,不需要额外的存储空间,在元素少的时候工作得好。
Java里面有很多数据类型,选取的是最简单的整数,但这并不失一般性。
即使是自己定制化的对象,实现了java.lang.Comparable, 把对应的 大于号(>)以及小于号(<)换成compareTo即可。
废话不多说,直接上代码:
/*@(#)InsertSort.java 2017-4-20
* Copy Right 2017 Bank of Communications Co.Ltd.
* All Copyright Reserved
*/
package com.sort.cn;
/**
* TODO Document InsertSort
* <p>
*
* 插入排序(直接插入排序)
* 平均O(n^2),最好O(n),最坏O(n^2);空间复杂度O(1);稳定;简单
*
* @version 1.0.0,2017-4-20
* @author Singit
* @since 1.0.0
*/
public class InsertSort {
public static void insertionSort(int[] a) {
int tmp;
for (int i = 1; i < a.length; i++) {
for (int j = i; j > 0; j--) {
if (a[j] < a[j - 1]) {
tmp = a[j - 1];
a[j - 1] = a[j];
a[j] = tmp;
}
}
}
}
public static void main(String[] args) {
int[] a = { 45, 36, 67, 98, 70, 11, 24, 53 };
insertionSort(a);
for (int i : a)
System.out.print(i + " ");
}
}
输出结果:
11 24 36 45 53 67 70 98
优点:稳定
空间复杂度O(1) ,时间复杂度O(n2)
最差情况:反序,需要移动n*(n-1)/2个元素
最好情况:正序,不需要移动元素
数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n);插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。
通常,插入排序呈现出二次排序算法中的最佳性能。
对于具有较少元素(如n<=15)的列表来说,二次算法十分有效。在列表已被排序时,插入排序是线性算法O(n)。
在列表“近似排序”时,插入排序仍然是线性算法。在列表的许多元素已位于正确的位置上时,就会出现“近似排序”的条件。
通过使用O(nlog2n)效率的算法(如快速排序)对数组进行部分排序,然后再进行选择排序,某些高级的排序算法就是这样实现的。