插入排序
插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
- 插入排序思想:
插入排序是把N个待排序的元素看成一个有序表和一个无序表,开始时有序表值包含一个元素,无序表中包含n-1个元素,排序的过程中每次从无序表中取出第一个元素,把它与有序表中的元素依次进行比较,将它插入到有序表中适当的位置,使之成为新的有序表
- 插入排序的代码实现:
public class InsertSort {
public static void main(String[] args) {
int[] array = {17, 3, 25, 14, 20, 9};
sort(array);
System.out.println(Arrays.toString(array));
}
private static void sort(int[] array) {
// 一共进行array.length - 1次
for (int i = 0; i < array.length - 1; i++) {
// 定义要插入的值,和要插入的下标
int insertVal = array[i + 1];
int insetIndex = i;
// 每一次,把从下标从0到i这个看成一个有序的数组,从i+1起到array.length - 1看成一个无序的数组
for (int j = i; j >= 0; j-- ){
// 取无序数组的第一位即下标位i+1作为待插入的数,从有序数组的最后一位开始比较,如果比待插入数大把该数往后复制
if (array[j] > insertVal) {
if (j == 0) {
insetIndex = 0;
}
array[j + 1] = array[j];
} else {
insetIndex = j + 1;
break;
}
}
array[insetIndex] = insertVal;
}
}
}
- 插入排序的时间效率
public static void main(String[] args) {
// int[] array = {35,88,16,27,32,4,90,56,79};
int[] array = new int[80000];
for (int i = 0; i < array.length; i++) {
// 随机生成一个0到8000000的随机数
Random random = new Random();
int nextInt = random.nextInt(8000000);
array[i] = nextInt;
}
// 排序前时间,h毫秒
long beforeSortTimeMillis = System.currentTimeMillis();
sort(array);
// 排序后时间
long afterSortTimeMillis = System.currentTimeMillis();
System.out.println("排序总共花费时间为:" + (afterSortTimeMillis - beforeSortTimeMillis) + "毫秒");
// System.out.println(Arrays.toString(array));
}
排序总共花费时间为:2026毫秒
可以看出插入排序的效率和选择排序(可以参考我的文章选择排序)差不多, 时间复杂度也是O(n^2)
插入排序对于小规模的数据或者是基本有序时很高效,数据有序程度越高,插入排序的效率越高