开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十二天,点击查看活动详情
三、插入排序
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的 适当位置,以达到排序的目的
基本思想
把n个待排序的元素看成为 一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中 包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它 的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的 适当位置,使之成为新的有序表。
分析
原始数组:101, 34, 119, 1
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
/**
* @author Kcs 2022/9/3
*/
public class InsertSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1, 45, 78};
System.out.println("排序前结果:" + Arrays.toString(arr));
insertSort(arr);
System.out.println("排序后结果:" + Arrays.toString(arr));
// 测试冒泡排序的时间复杂度, 用一个较大的数据进行测试
int[] test = new int[8000];
for (int i = 0; i < 8000; i++) {
test[i] = (int) (Math.random() * 80000);
}
Date beforeDate = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatBefore = simpleDateFormat.format(beforeDate);
System.out.println("排序前时间" + formatBefore);
insertSort(test);
Date afterDate = new Date();
String afterDateformat = simpleDateFormat.format(afterDate);
System.out.println("排序后时间" + afterDateformat);
}
/**
* 插入排序
*/
public static void insertSort(int[] arr) {
int insertValue = 0;
int insertIndex = 0;
for (int i = 1; i < arr.length; i++) {
//定义待插入的数
insertValue = arr[i];
//arr[1] 前面这个数的索引
insertIndex = i - 1;
//insertValue 找到插入的位置 由小到大 < ;由大到小:<
// insertIndex >= 0 放置越界
// insertValue < arr[insertIndex] : 带插入的数字
// arr[insertIndex] 后移
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//找到插入的位置
if (insertIndex + 1 == i) {
arr[insertIndex + 1] = insertValue;
}
// System.out.println("第" + i + "轮排序结果:" + Arrays.toString(arr));
}
}
}