Java-排序算法-插入排序

时间:2021-01-09 11:09:55

一、插入排序的原理

将一个记录插入到一个已经排好序的有序表中,从而得到一个新的,记录数增1的新的有序表。从第一个元素开始,先将第一个元素看做一个排好序的子序列,然后从第二个元素开始起,对第二个元素进行插入,之后得到一个两个元素的有序表,然后再对第三个元素进行插入,得到一个三个元素的有序表...,依次类推,直到最后一个元素插入正确,整个序列有序为止。

二、插入排序的伪代码实现

1 INSERTION-SORT(A)
2   for j ← 2 to length[A]
3        do key ← A[j]
4           ▹ Insert A[j] into the sorted sequence A[1 .. j - 1] to generate a new sorted sequence A[1 .. j]
5           i ← j - 1
6           while i > 0 and A[i] > key
7               do A[i + 1] ← A[i]
8                  i ← i - 1
9           A[i + 1] ← key

三、插入排序的Java源码实现

 

 1 import java.util.Comparator;
 2 
 3 
 4 public class InsertSort {
 5 
 6     /**
 7      * 泛型方法实现插入排序算法,
 8      * 泛型的类型不能是基础类型的,必须得是引用类型的
 9      */
10     public static <T> void insertSort(T[] t, Comparator<? super T> comparator){
11         T key = t[0];
12         for(int j = 1; j < t.length; j ++)
13         {
14             key = t[j];
15             //Insert the t[j] into the sorted sequence t[0, j-1], to generate a new sorted sequence t[0, j]
16             int i = j-1;
17             while(i > -1 && comparator.compare(t[i], key) > 0)
18             {
19                 t[i+1] = t[i];
20                 i--;
21             }
22             t[i+1] = key;
23         }
24     }
25     
26     /**
27      * @param args
28      */
29     public static void main(String[] args) {
30         // TODO Auto-generated method stub
31         Integer[] ints =  {2, 0, 5, 23, 1, 4, 8, 56, 19};
32         insertSort(ints, new Comparator<Integer>(){
33             public int compare(Integer o1, Integer o2){
34                 return o1.intValue() - o2.intValue();
35             }
36         });
37         
38         for (int i = 0; i < ints.length; i++)
39         {
40             System.out.print(ints[i] + " ");
41         }
42         System.out.println();
43     }
44 
45 }

运行结果:

0 1 2 4 5 8 19 23 56 

四、复杂度分析

O(N^2)