/**
* 直接插入排序,时间复杂度O(n²)。
* 将整个顺序表分为已排序的部分和未排序的部分,遍历未排序的部分,往已排序部分的合适位置插入
*/
public class InsertSort {
public static void sortAsc(int[] arr) {
if (arr == null || arr.length <= 1)
return;
// 外层循环遍历未排序的元素,0角标的元素作为初始的已排序部分,所以未排序部分是从1角标开始
for (int i = 1; i < arr.length; i++) {
int t = arr[i]; // 哨兵
int j = i - 1;
// 内层循环从后往前(从大往小)遍历已排序的元素
for (; j >= 0 && arr[j] > t; j--) {
arr[j + 1] = arr[j]; // 往后挪腾位置
}
arr[j + 1] = t;
}
}
public static void sortDesc(int[] arr) {
if (arr == null || arr.length <= 1)
return;
// 外层循环遍历未排序的元素,0角标的元素作为初始的已排序部分,所以未排序部分是从1角标开始
for (int i = 1; i < arr.length; i++) {
int t = arr[i]; // 哨兵
int j = i - 1;
// 内层循环从后往前(从小往大)遍历已排序的元素
for (; j >= 0 && arr[j] < t; j--) {
arr[j + 1] = arr[j]; // 往后挪腾位置
}
arr[j + 1] = t;
}
}
public static void main(String[] args) {
testCase3();
}
public static void testCase() {
int[] arr = {3, 2, 6, 9, 4, 1};
sortAsc(arr);
print(arr);
}
public static void testCase1() {
int[] arr = {3, 2};
sortAsc(arr);
print(arr);
}
public static void testCase2() {
int[] arr = {3, 2, 6, 9, 4, 3, 1, 2};
sortAsc(arr);
print(arr);
}
public static void testCase3() {
int[] arr = {3, 2, 6, 9, 4, 3, 1, 2};
sortDesc(arr);
print(arr);
}
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
直接插入排序Java代码示例与解析
于 2022-06-06 16:01:15 首次发布