插入排序算法思路
从小到大排序时
核心代码
/**
* 插入排序算法原理:
* 将数组中的数据分为2个区域:已排序区间和未排序区间。
* 初始时已排序区间只有一个元素,就是数组中的第一个元数
* 核心思想就是取未排序区间中的元素,在已排序区间中找合适插入位置将其插入,保证已排序区间数据一直有序
* 重复这个过程直到未排序区间中元素为空,算法结束。
*
* @param arr 原数组
* @return 排序后的数组
*/
private static int[] insertionSort(int[] arr) {
if (null != arr && arr.length > 0) {
// 第一层是未排序区间每取一个到已排序区间找合适的位置插入
for (int i = 1; i < arr.length; ++i) {
// i的位置会被覆盖,需要拿出来
int value = arr[i];
// 已排序区域的末尾一定是未排序区域的前一个位置
int j = i - 1;
for (; j >= 0; --j) {
if (value < arr[j]) {
// 移动数据空出位置来
arr[j + 1] = arr[j];
} else {
break;
}
}
// 插入数据,挪完之后j--了,所以这里是j+1加回一个
arr[j + 1] = value;
}
}
return arr;
}
测试用例
package arithmetic.ecut.com.排序.a_插入排序;
/**
* 插入排序算法
*
* @author 起凤
* @description: TODO
* @date 2022/4/5
*/
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {2, 3, 1, 4, -1, 8, -1};
int[] sort = insertionSort(arr);
print(sort);
int[] arr1 = {-1, 7, 1, 4, 5, 8, 7};
int[] sort1 = insertionSort(arr1);
print(sort1);
}
private static int[] insertionSort(int[] arr) {
if (null != arr && arr.length > 0) {
// 第一层是未排序区间每取一个到已排序区间找合适的位置插入
for (int i = 1; i < arr.length; ++i) {
// i的位置会被覆盖,需要拿出来
int value = arr[i];
// 已排序区域的末尾一定是未排序区域的前一个位置
int j = i - 1;
for (; j >= 0; --j) {
if (value < arr[j]) {
// 移动数据空出位置来
arr[j + 1] = arr[j];
} else {
break;
}
}
// 插入数据,挪完之后j--了,所以这里是j+1加回一个
arr[j + 1] = value;
}
}
return arr;
}
private static void print(int[] sort) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < sort.length; i++) {
builder.append(sort[i]).append(",");
}
System.out.println(builder);
}
}