思路分析:
从数组的第二个位置开始,记录当前要进行插入的元素值为insertValue,此元素的前一个位置的索引为insertIndex,把insertValue与前面的一个元素相比较,如果大于前面的元素,则直接在此位置插入,如果小于前面位置上的元素,则把前面位置上的元素后移,即arr[insertIndx + 1] = arr[insertIndex],索引insertIndex–1,再进行下一次判断,直到找到可以插入的位置,这里要注意角标越界问题
代码展示:
package com.monster.sort;
import java.util.Arrays;
/**
* @author Monster
* @version v1.0
* @time 03-18-2021 15:59:52
* @description: 插入排序法
*/
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 100);
}
System.out.println(Arrays.toString(arr));
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int insertValue = arr[i];
int insertIndex = i - 1;
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
arr[insertIndex + 1] = insertValue;
}
}
}
比较冒泡排序、选择排序、插入排序
-
冒泡排序是每相邻的两个元素都要进行比较大小,如果满足条件就交换位置,比较、交换的次数太多,效率极低,80000个数据执行时间为11104毫秒
-
选择排序,每一个元素都要跟后面所有的元素进行比较,找出最小的元素并记录其角标,然后进行交换,交换次数最多n – 1次,效率较高,80000个数据执行时间为2198毫秒,比冒泡快了5倍左右
-
插入排序,每一次都和前面的数据比较,只要找到比其大的数就可以插入,比选择排序比较的次数少了许多;这里不需要交换位置,但多了数据的后移操作,效率更高,80000个数据执行时间为653毫秒,比冒泡快了3~4倍