public static int[] insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int preIndex = i - 1;
int current = arr[i];
while (preIndex >= 0 && current < arr[preIndex]) {
arr[preIndex + 1] = arr[preIndex];
preIndex -= 1;
}
arr[preIndex + 1] = current;
}
return arr;
}
这段代码是一个插入排序算法的实现。插入排序是一种简单直观的排序算法,其基本思想是将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置,直到整个数组有序为止。
让我们逐步解释这段代码的过程:
-
public static int[] insertionSort(int[] arr)
: 这是一个公共静态方法,用于对传入的整数数组进行插入排序,并返回排序后的数组。 -
for (int i = 1; i < arr.length; i++)
: 外层循环是插入排序的主要循环。它从数组的第二个元素开始遍历(索引1),因为第一个元素默认是已排序的。 -
int preIndex = i - 1;
: 在每一轮排序开始时,preIndex
被初始化为当前索引i
的前一个索引,即当前元素的前一个元素的索引。 -
int current = arr[i];
: 获取当前索引i
处的元素值,存储在变量current
中,准备将其插入到正确的位置。 -
while (preIndex >= 0 && current < arr[preIndex]) { ... }
: 在内层循环中,进行元素的比较与插入操作。当preIndex
大于等于0且current
小于已排序部分的元素时,进入循环。 -
arr[preIndex + 1] = arr[preIndex];
: 将已排序部分中较大(或较小)的元素向右移动一个位置,为current
腾出插入位置。 -
preIndex -= 1;
: 将preIndex
向左移动,继续向前寻找合适的插入位置。 -
arr[preIndex + 1] = current;
: 在内层循环结束后,将current
插入到正确的位置,即preIndex + 1
处。 -
return arr;
: 最后返回排序完成后的整数数组。
插入排序的核心思想是将未排序部分的元素逐个插入到已排序部分的正确位置,以此来构建有序数组。它类似于我们打扑克牌时,将新抽到的牌插入到手中已排序的牌中,使得手中的牌始终保持有序。插入排序的时间复杂度为O(n^2),虽然效率没有快速排序或归并排序高,但对于小规模数据或部分有序的数组,插入排序可能更有效。