对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列。接着从而个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一条记录插入到有序序列中为止。
例如:数组 {38,65,97,76,13,27,49}
第一步插入38以后:[38]65 97 76 13 27 49
第一步插入65以后:[38 65]97 76 13 27 49
第一步插入97以后:[38 65 97]76 13 27 49
第一步插入76以后:[38 65 76 97]13 27 49
第一步插入13以后:[13 38 65 76 97]27 49
第一步插入27以后:[13 27 38 65 76 97]49
第一步插入49以后:[13 27 38 49 65 76 97]
【程序示例如下】:
1 /** 2 * 插入排序 3 */ 4 public class InsertionSort { 5 public static void insertSort(Integer[] src){ 6 //循环遍历目标数组,从下标1开始,默认有一个元素 7 for(int i=1;i<src.length;i++){ 8 int j=i; 9 int temp = src[i]; 10 while((j >= 1) && (src[j-1] > temp)){ 11 src[j]=src[j-1]; 12 j--; 13 } 14 src[j]=temp; 15 } 16 } 17 public static void main(String[] args){ 18 Integer[] array = {13,27,38,49,65,76,97}; 19 //使用插入排序,对 array 进行排序 20 insertSort(array); 21 System.out.println(Arrays.asList(array).toString()); 22 } 23 }
【输出结果】:[13, 27, 38, 49, 65, 76, 97]
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为 。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
【程序示例如下】:
1 /** 2 * 插入排序 3 */ 4 public class TestSort { 5 public static Integer[] insertSort(int target, Integer[] src){ 6 Integer[] newArray = new Integer[src.length+1]; 7 //将原数据拷贝到目标数组中 8 System.arraycopy(src,0,newArray,0,src.length); 9 int j = src.length-1; 10 int n = newArray.length-1; 11 while((j >= 0) && (src[j] > target)){ 12 newArray[n] = src[j]; 13 j--; 14 n--; 15 } 16 newArray[n] = target; 17 return newArray; 18 } 19 public static void main(String[] args){ 20 Integer[] array = {7,13,43,56,17,7,32}; 21 //向原有队列插入一个数据 0 22 Integer[] integers = insertSort(0, array); 23 array = integers; 24 System.out.println(Arrays.asList(array).toString()); 25 } 26 }
【输出结果】:[0, 7, 13, 43, 56, 17, 7, 32]