插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。下面是一个详细的Java代码实现,包括每一步的注释,帮助你更好地理解插入排序的过程。
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {4, 3, 2, 10, 12, 1, 5, 6};
insertionSort(arr);
printArray(arr);
}
// 插入排序方法
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; ++i) {
// 当前需要排序的元素
int key = arr[i];
// 已排序序列的最后一个元素的索引
int j = i - 1;
// 将大于key的元素后移
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
// 找到key的插入位置并插入
arr[j + 1] = key;
}
}
// 打印数组的方法
public static void printArray(int arr[]) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
}
代码解释:
-
main
方法中定义了一个待排序的数组arr
,并调用insertionSort
方法进行排序,最后调用printArray
方法打印排序后的数组。 -
insertionSort
方法是插入排序的核心实现。- 外层循环
for (int i = 1; i < n; ++i)
从数组的第二个元素开始遍历,因为第一个元素默认已经是有序的。 -
int key = arr[i];
取出当前需要排序的元素。 - 内层循环
while (j >= 0 && arr[j] > key)
从已排序序列的最后一个元素开始向前扫描,如果已排序的元素大于key
,则将该元素后移一位。 - 当找到合适的插入位置时(即
arr[j] <= key
),将key
插入到该位置。
- 外层循环
-
printArray
方法用于打印数组,方便查看排序结果。
插入排序的时间复杂度在最坏的情况下是O(n2),即当输入数组是逆序的时候。最好的情况下,当输入数组已经是有序的,时间复杂度是O(n)。平均时间复杂度是O(n2)。空间复杂度是O(1),因为它只需要一个额外的空间来交换数组元素。尽管插入排序在大数据集上不如更高级的排序算法(如快速排序、归并排序、堆排序等)效率高,但在小数据集上,由于其实现简单且不需要额外的空间,它仍然是一个很好的选择。