一、概念
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
——《百度百科》
二、原理
插入排序的原理是将一个待排序的长度为n的数组看成一个有序表和一个无序表,开始时有序表中只包含数组中的第一个元素,无序表中包含n-1个元素。排序过程中每次从无序表中取出第一个元素与有序表中的元素依次比较,将其插入到有序表中适当的位置,形成一个新的有序表。
假设需要排序的数组为[9,8,7,6,5,4,3,2,1],需要将其按从小到大的顺序排序。首先将数组第一个元素看成一个有序表,n-1个元素看成一个无序表。
步骤:
- 取出无序表中的第一个元素与有序表中的元素依次比较,将其插入到适当的位置,形成一个新的有序表。
- 再次取出无序表中的第一个元素插入到有序表中适当的位置。
- 循环取出无序表中的每一个元素,将其插入到有序表中适当的位置,直到无序表为空时,则有序表就是最后的排序结果。
三、代码实现
package com.lee.sort;
import java.util.Arrays;
//插入排序
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[9];
for (int i = 0; i < 9; i++) {
arr[i] = 9 - i;
}
System.out.println("排序前:" + Arrays.toString(arr));
insertSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
}
//插入排序算法
public static void insertSort(int[] arr){
int insertValue = 0;
int insertIndex = 0;
for(int i = 1; i < arr.length; i++){
//insertValue为需要插入的数据
insertValue = arr[i];
//insertIndex为需要插入数据的前一个下标
insertIndex = i - 1;
while(insertIndex >= 0 && insertValue < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
if(insertIndex + 1 != i){ //优化:如果当insertIndex + 1 == i时,则证明当前要插入的元素就在当前的位置,不需要执行插入
arr[insertIndex + 1] = insertValue; //所以就当insertIndex + 1 != i时执行插入
}
System.out.println("第" + i + "次排序" + Arrays.toString(arr));
}
}
}
本人初学,如有不当,请多指教!