插入排序
基本介绍:
插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
基本思想:
是一种简单直观且稳定的排序算法。插入算法把要排序的数组分成两部分:第一部分为有序表,开始时有序表只包含一个元素,第二部分为无序表,无序表中有n-1个元素。排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素中的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
动图:
思路图解:
注:蓝色填充为无序
代码演示:
分步演示代码:
package InsertSort;
import java.util.Arrays;
public class insertsort {
public static void main(String[] args) {
int arr[] = {101,34,119,1};
insert(arr);
}
public static void insert(int arr[]) {
//第一轮
int insertValue = arr[1];//需要排序的数
int insertIndex = 0;//需要插入数的前一个数的下标
//进行插入
//1、insertIndex>=0 防止越界
//2、insertValue<arr[insertIndex] 满足待插入的数小于前一个数,还没有找到插入位置
//3、当前这个值后移此时数组变成 {101,101,119,1}
while(insertIndex>=0 && insertValue<arr[insertIndex]) {
arr[insertIndex+1] = arr[insertIndex]; //此时数组变成 {101,101,119,1}
insertIndex--;
}
//当退出while循环时,说明插入的位置找到,insertIndex+1;
//例如 {101,334,119,1}如果不满足while循环则直接插入到后面的位置
arr[insertIndex+1] = insertValue;
System.out.println("第一轮插入后");
System.out.println(Arrays.toString(arr));
//第二轮
int insertValue1 = arr[2];//需要排序的数
int insertIndex1 = 1;//需要插入数的前一个数的下标
//进行插入
//1、insertIndex>=0 防止越界
//2、insertValue<arr[insertIndex] 满足待插入的数小于前一个数,还没有找到插入位置
//3、当前这个值后移此时数组变成 {101,101,119,1}
while(insertIndex1>=0 && insertValue1<arr[insertIndex1]) {
arr[insertIndex1+1] = arr[insertIndex1]; //此时数组变成 {101,101,119,1}
insertIndex1--;
}
//当退出while循环时,说明插入的位置找到,insertIndex+1;
//例如 {101,334,119,1}如果不满足while循环则直接插入到后面的位置
arr[insertIndex1+1] = insertValue1;
System.out.println("第二轮插入后");
System.out.println(Arrays.toString(arr));
//第三轮
int insertValue2 = arr[3];//需要排序的数
int insertIndex2 = 2;//需要插入数的前一个数的下标
//进行插入
//1、insertIndex>=0 防止越界
//2、insertValue<arr[insertIndex] 满足待插入的数小于前一个数,还没有找到插入位置
//3、当前这个值后移此时数组变成 {101,101,119,1}
while(insertIndex2>=0 && insertValue2<arr[insertIndex2]) {
arr[insertIndex2+1] = arr[insertIndex2]; //此时数组变成 {101,101,119,1}
insertIndex2--;
}
//当退出while循环时,说明插入的位置找到,insertIndex+1;
//例如 {101,334,119,1}如果不满足while循环则直接插入到后面的位置
arr[insertIndex2+1] = insertValue2;
System.out.println("第三轮插入后");
System.out.println(Arrays.toString(arr));
}
}
综合后代码:
package InsertSort;
import java.util.Arrays;
public class insertsort {
public static void main(String[] args) {
int arr[] = {101,34,119,1};
insert(arr);
}
public static void insert(int arr[]) {
//综合
for(int i=1;i<arr.length;i++) {
//第一轮
int insertValue = arr[i];//需要排序的数
int insertIndex = i-1;//需要插入数的前一个数的下标
//进行插入
//1、insertIndex>=0 防止越界
//2、insertValue<arr[insertIndex] 满足待插入的数小于前一个数,还没有找到插入位置
//3、当前这个值后移此时数组变成 {101,101,119,1}
while(insertIndex>=0 && insertValue<arr[insertIndex]) {
arr[insertIndex+1] = arr[insertIndex]; //此时数组变成 {101,101,119,1}
insertIndex--;
}
//当退出while循环时,说明插入的位置找到,insertIndex+1;
//例如 {101,334,119,1}如果不满足while循环则直接插入到后面的位置
arr[insertIndex+1] = insertValue;
System.out.println("插入后");
System.out.println(Arrays.toString(arr));
}
}
}