Java基础算法(2)——插入排序
1.插入排序思路简述
遍历时每一元素插入前面已排序的序列中的合适位置(若为升序则大于前一元素小于后一元素)
以c s d n x i n g w e i 为例子,排序过程如下:
因为要插入元素,所以直接从第二个元素开始遍历:
以下为排序过程:
第一次插入s: s>c,s插入c后面: c s d n x i n g w e i
第二次插入d: d>c,与下一元素比较 d<s 插入c和s之间:c d s n x i n g w e i
第三次插入n: n>c,n>d,n<s,插入d和s之间:c d n s x i n g w e i
第四次差入x: x>c,x>d,x>n,x>s,插入s之后 :c d n s x i n g w e i
第五次差入i : i>c,i>d,i<n i插入d和n之间:c d i n s x n g w e i
第六次差入n: … c d i n n s x g w e i
第七次差入g: … c d g i n n s x w e i
第八次差入w: … c d g i n n s w x e i
第九次差入e: … c d e g i n n s w x i
第十次差入i: … c d e g i i n n s w x
当然以上比较大小是从前往后,是寻找比当前大的数值,也可是从后往前,从后往前就是寻找比当前小或等于的数值,下面代码实现是采用从后往前比较大小,若当前元素大于所遍历的元素则交换位置:
同样是上面例子:
分析最后一次插入过程:
第9次遍历结果 c d e g i n n s w x i
插入i
采用从后往前比较大小,寻找第一个比当前插入值小或等于的数值,并放在此数值之后。
i<x,比当前插入值大,所以i和x交换位置
c d e g i n n s w i x
i<w,比当前插入值大,所以i和w交换位置
c d e g i n n s i w x
i<s,比当前插入值大,所以i和s交换位置
c d e g i n n i s w x
i<n,比当前插入值大,所以i和n交换位置
c d e g i n i n s w x
i<n,比当前插入值大,所以i和n交换位置
c d e g i i n n s w x
i=i,是比当前插入值小或等于的数值,所以不用交换位置了,当前所在位置即使合理的插入位置
所以第10次遍历结果 c d e g i i n n s w x
2.完整代码实现(含注释)
与上一篇文章选择排序类似,继承排序类模板类Template
Java基础算法(1)——选择排序
package Algorithm.Sort;
/**
* 插入排序
* time:2019.08.20
* author:lipiao
*/
public class InsertionSort extends Template {
//升序
public static void sort(Comparable[] a) {
int N = a.length;
System.out.println("排序过程:");
//从下标为1开始遍历
for (int i = 1; i < N; i++) {
//遍历a[i]之前的元素 并插入到大于前一元素小于后一元素的位置
//以此保证每次插入元素后下标为0到i的序列为升序
for (int j=i;j>0&&less(a[j],a[j-1]);j--){
exch(a,j,j-1);
}
//输出每次遍历后的结果
show(a);
}
}
public static void main(String[] args) {
String[] a = {"c", "s", "d", "n", "x", "i", "n", "g", "w", "e", "i"};
System.out.println("插入排序前");
show(a);
sort(a);
assert isSorted(a);
System.out.println("插入排序后");
show(a);
}
}
3.运行效果

完整的排序过程分析:
插入排序前
c s d n x i n g w e i
排序过程:
插入s
第1次遍历结果 c s d n x i n g w e i
=============
插入d
d<s,所以d和s交换位置
c d s n x i n g w e i
第2次遍历结果 c d s n x i n g w e i
=============
插入n
n<s,所以n和s交换位置
c d n s x i n g w e i
第3次遍历结果 c d n s x i n g w e i
=============
插入x
第4次遍历结果 c d n s x i n g w e i
=============
插入i
i<x,所以i和x交换位置
c d n s i x n g w e i
i<s,所以i和s交换位置
c d n i s x n g w e i
i<n,所以i和n交换位置
c d i n s x n g w e i
第5次遍历结果 c d i n s x n g w e i
=============
插入n
n<x,所以n和x交换位置
c d i n s n x g w e i
n<s,所以n和s交换位置
c d i n n s x g w e i
第6次遍历结果 c d i n n s x g w e i
=============
插入g
g<x,所以g和x交换位置
c d i n n s g x w e i
g<s,所以g和s交换位置
c d i n n g s x w e i
g<n,所以g和n交换位置
c d i n g n s x w e i
g<n,所以g和n交换位置
c d i g n n s x w e i
g<i,所以g和i交换位置
c d g i n n s x w e i
第7次遍历结果 c d g i n n s x w e i
=============
插入w
w<x,所以w和x交换位置
c d g i n n s w x e i
第8次遍历结果 c d g i n n s w x e i
=============
插入e
e<x,所以e和x交换位置
c d g i n n s w e x i
e<w,所以e和w交换位置
c d g i n n s e w x i
e<s,所以e和s交换位置
c d g i n n e s w x i
e<n,所以e和n交换位置
c d g i n e n s w x i
e<n,所以e和n交换位置
c d g i e n n s w x i
e<i,所以e和i交换位置
c d g e i n n s w x i
e<g,所以e和g交换位置
c d e g i n n s w x i
第9次遍历结果 c d e g i n n s w x i
=============
插入i
i<x,所以i和x交换位置
c d e g i n n s w i x
i<w,所以i和w交换位置
c d e g i n n s i w x
i<s,所以i和s交换位置
c d e g i n n i s w x
i<n,所以i和n交换位置
c d e g i n i n s w x
i<n,所以i和n交换位置
c d e g i i n n s w x
第10次遍历结果 c d e g i i n n s w x
=============
插入排序后
c d e g i i n n s w x
Process finished with exit code 0