插入排序是一种稳定的排序算法。
基本思想:
把N个待排序元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有N-1个元素;每次从无序表中取出一个元素,将它插入到有序表中,使之成为新的有序表,重复N-1次完成整个排序过程。
算法分析:
1)从序列第一个元素开始,该元素可以认为已经被排序;
2)去下一个元素设为待插入元素,在已排序的序列中从后向前扫描,如果该元素大于带插入元素,将该元素移到下一个位置;
3)重复步骤2),直到找到已排序的元素小于或等于待排序元素的位置,插入元素;
4)重复2),3)步骤,完成排序。
时间复杂度:
1)顺序排列时,只需比较(N-1)次,插入排序的时间复杂度为O(n);
2)逆序排序时,只需比较N(N-1)/2 次,插入排序时间复杂度为O(n2);
3)当原始序列是无序时,平均时间复杂度为O(n2);
空间复杂度:
插入排序过程中,需要一个临时变量temp存储待排序元素,因此空间复杂度为O(1)
排序过程图:

接下来看一下具体的Java代码实现:
第一种形式:
1 public void sort(int arr[]) {
2 for(int i =1; i<arr.length;i++) {
3 int insertVal = arr[i]; //插入的数
4 int index = i-1; //被插入的位置(准备和前一个数比较)
5 while(index>=0&&insertVal<arr[index]) { //如果插入的数比被插入的数小
6 arr[index+1]=arr[index]; //将把 arr[index] 向后移动
7 index--; //让 index 向前移动
8 }
9 arr[index+1]=insertVal; //把插入的数放入合适位置
10 }
11 }
第二种形式:
1 public class InsertSort {
2 public static void main(String[] args) {
3 int a[] = {3,1,5,7,2,4,9,6};
4 new InsertSort().insertSort(a);
5 }
6 //直接插入排序算法的实现
7 private void insertSort(int[] a) {
8 for( int i=1;i<a.length;i++){
9 int temp = a[i]; //temp为本次循环待插入有序列表中的数
10 for(int j=i-1;j>=0 && a[j]>temp;j--){ //寻找temp插入有序列表的正确位置
11 a[j+1] = a[j]; //元素后移,为插入temp做准备
12 }
13 a[j+1] = temp; //插入temp
14 print(a,a.length,i);
15 }
16 printResult(a,a.length);
17 }
18 //打印排序的最终结果
19 private void printResult(int[] a){
20 System.out.print("最终排序结果:");
21 for(int j=0;j<a.length;j++){
22 System.out.print(" "+a[j]);
23 }
24 System.out.println();
25 }
26 // 打印排序的每次循环结果
27 private void print(int[] a, int i) {
28 System.out.print("第"+i+"次:");
29 for(int j=0;j<a.length;j++){
30 System.out.print(" "+a[j]);
31 }
32 System.out.println();
33 }
34 }