插入排序的原理就和打扑克牌一样,比如打扑克牌开始时给你发了5张牌,刚开始这五张牌没有整理是乱序的,那么这个时候你就先拿起一张牌默认为有序的(因为只有一张),之后再拿起第二张和前面的一张进行对比小的放前面大的放后面,之后再拿起第三张和前面两张进行比较按照从小到大的顺序找到合适的位置插入进去,一直循环直到没有牌需要插入。这就是插入排序的一个简单原理。在代码实现过程中就是按照这样的一个思路来走的,只是代码比较笨拙在进行每一次寻找插入位置时都需要和前面的元素一一进行比较将前面的比较大的元素像后移最后自己插在中间合适的空闲处。
如果还没有理解可以看看图,更容易理解
大致上就是这么一个过程,一直循环重复知道所有的顺序都排好。
下面是具体代码实现:
/**
* A.compareTo(B) > 0 表示A > B 返回大于零
*/
public void sort(Element[] elements) {
for(int i = 1; i < elements.length; i++){
Element temp = elements[i];
int j = i;
while(j > 0 && elements[j-1].compareTo(temp) > 0){
elements[j] = elements[j - 1];
j--;
}
if(j != i)
elements[j] = temp;
}
}
时间复杂度:
最好情况 最差情况
比较次数 n-1 2+3+4+...+n = (n*n+n-2)/2
移动次数 0 1+2+3+...+(n-1) = n*n/2
所以插入排序的时间复杂度
最坏情况:O(n*n) 最好情况O(n) 平均情况O(n *n)