本文带来八大排序算法之插入排序。
插入排序(Insertion Sort)属于内部排序算法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
插入排序基本思想:
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出一个元素,把它的排序码依次与有序元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
推导过程(以数组 arr = {101, 34, 119, 1}为例):
//逐步推导,方便理解
//第1轮{101, 34, 119, 1} ==> {34, 101, 119, 1}
int insertValue = arr[1]; //根据插入排序定义,从第二个数开始找位置
int insertIndex = 1 - 1; //表示待排序数前面的那个索引,即arr[1]前面数的下标
while(insertIndex >=0 && insertValue < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//
arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1 //此时isertIndex 为-1 故要 先 + 1
System.out.println("第1轮排序后的顺序时:" + Arrays.toString(arr));
//第2轮
insertValue = arr[2]; //根据插入排序定义,从第3个数开始找位置
insertIndex = 2 - 1;
while(insertIndex >=0 && insertValue < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//
arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1
System.out.println("第2轮排序后的顺序时:" + Arrays.toString(arr));
//第3轮
insertValue = arr[3]; //根据插入排序定义,从第3个数开始找位置
insertIndex = 3 - 1;
while(insertIndex >=0 && insertValue < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//
arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1
System.out.println("第3轮排序后的顺序时:" + Arrays.toString(arr));
代码实现:
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args){
int[] arr = {101, 34, 119, 1};
insertSort(arr);
}
//插入排序 insection sort
public static void insertSort(int[] arr){
int insertValue = 0;
int insertIndex = 0;
for(int i=1; i<arr.length; i++){
insertValue = arr[i]; //表示待插入的数,根据插入排序定义,从第二个数开始找位置
insertIndex = i - 1; //表示待排序数前面的那个索引,即arr[1]前面数的下标
//给insertValue 找到插入的位置
//说明:
//1. insertValue >= 0 保证在给insertValue 找插入位置时,数组不越界
//2. insertValue < arr[insertIndex] 表示 待插入的数 还没有找到插入位置
//3. 找到位置后,需要将arr[insertIndex]后移动
while(insertIndex >=0 && insertValue < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//优化--判断是否需要赋值
if(insertIndex + 1 != i){
arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1
}
System.out.println("第"+i+"轮排序后的顺序时:" + Arrays.toString(arr));
}
}
}