1. 直接插入排序算法介绍
直接插入排序是一种非常好理解的排序算法,它的原理是将数组分为两个部分,一部分是已排序的,另外一部分是未排序的,每次排序都会从未排序的那一部分取出一个数,从有序序列的最后一个元素开始往前扫描,直至找到插入的位置。
以升序为例,目前有一个数组:[3, 2, 1, 5, 4, 6]进行直接插入排序,第一个元素无需与其它元素比较,是有序序列的第一个元素
所以我们从第一个元素开始排序:
第一轮排序(数字2):2 < 3,所以2需要和3做交换,序列为[2, 3, 1, 5, 4, 6],此时因为2已经是有序序列的第一个元素,所以确定插入位置,对下一个数字进行排序。
第二轮排序(数字1):1 < 3,所以1和3交换位置,序列为[2, 1, 3, 5, 4, 6],此时1前面还有元素,需要继续做比较;1 < 2,所以1与2交换位置,此时1为有序序列的第一个元素,确定插入位置,对下一个数字进行排序。
第三轮排序(数字5):5 > 3,无需交换位置,确定插入位置,对下一个数字进行排序。序列为[1, 2, 3, 5, 4, 6]
第四轮排序(数字4):4 < 5,4和5交换位置,序列为[1, 2, 3, 4, 5, 6],虽然此时已经有序,但计算机并不知道,它会继续与前一个元素做比较;4 > 3,无需交换位置,确定插入位置,对下一个数字进行排序。
第五轮排序(数字6):6 > 5,无需交换位置,确定插入位置,排序完成。
2. 代码实现
/**
* @author Zeng
* @date 2020/2/29 11:08
*/
public class 插入排序1 {
public static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void insertSort(int[] arr){
for (int i = 1; i < arr.length; i++){
int current = arr[i];
int tempIndex = i - 1;
//寻找插入位置
while (tempIndex >= 0 && arr[tempIndex] > current){
swap(arr, tempIndex, tempIndex + 1);
tempIndex--;
}
System.out.print("第"+i+"轮排序结果:");
for (int j : arr) {
System.out.print(j+" ");
}
System.out.println();
}
}
public static void main(String[] args) {
int[] arr = new int[]{3, 2, 1, 5, 4, 6};
insertSort(arr);
}
}