概述
将待排序数组分为有序区和无序区两部分,不断往有序区里插入元素,直到有序区的长度为数组长度。初始时,有序区数组长度为1。默认为数组第一个元素(索引为0)。
图解
备注:图来自黑马程序员满一航老师的视频,感兴趣的小伙伴可以自行b站搜索。
实现
package com.lovehena.bilibili.sort;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
/*
* java实现插入排序
* 将待排序数组分为有序区和无序区两部分,
* 不断往有序区里插入元素,
* 直到有序区的长度为数组长度。
* 初始时,有序区数组长度为1。
* 默认为数组第一个元素(索引为0)。
* */
@Slf4j
public class InsertSort {
public static void main(String[] args) {
int[] arr = {0, 3, 1, -9};
log.info("排序前的数组:{}", Arrays.toString(arr));
insertSort(arr);
log.info("排序后的数组:{}", Arrays.toString(arr));
log.info("---------------------------");
int[] arr2 = {100, 9, -1, -9, 1000, 5, 0};
log.info("排序前的数组:{}", Arrays.toString(arr2));
insertSort(arr2);
log.info("排序后的数组:{}", Arrays.toString(arr2));
}
private static void insertSort(int[] arr) {
// i:待插入元素的索引 假设有序区已经有一个元素 且索引为0
for (int i = 1; i < arr.length; i++) { // i最大值为arr.length-1 即指向数组最后一个元素
int temp = arr[i];
int j = i - 1; // j表示有序区元素的索引
while (j >= 0) {
if (temp < arr[j]) {
// j+1=i 会覆盖arr[i]的值 所以需要把arr[i]存起来
// 将较大值移入未排序区
arr[j + 1] = arr[j];
} else {
break;
}
j--;
}
arr[j + 1] = temp; // 将待插入元素移入排序区
}
}
// TODO 扩展:数组从大到小排序如何实现?将while循环改为for循环如何实现?
}
输出
扩展
数组从大到小排序如何实现?将while循环改为for循环如何实现?
最后
好了,如果对你有帮助,欢迎点个免费的赞哦。