插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到的额外空间的排序),因而在从后向前扫描过程中,找到排序位置后,需要将已排序元素逐步向后挪位,为最新元素提供插入空间。
下面是Java中插入排序的一个实现示例,并附有详细的注释:
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {12, 11, 13, 5, 6};
insertionSort(arr);
System.out.println("Sorted array: ");
printArray(arr);
}
// 插入排序算法
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;
}
arr[j + 1] = key; // 插入key到正确的位置
}
}
// 辅助方法,用于打印数组
static void printArray(int arr[]) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
}代码解析:
初始化:首先,我们设定一个循环从数组的第二个元素开始(索引为1,因为单个元素默认已排序),因为第一个元素前面没有其他元素,所以不需要进行任何操作。
选择键(key):在每次循环中,我们选择当前要排序的元素作为键(key),这里是
arr[i]。向后移动元素:然后,我们将当前元素与它之前的元素进行比较(即
arr[j],其中j从i-1开始递减),如果前面的元素比当前元素大,我们就将该元素向后移动一个位置(即arr[j+1] = arr[j])。插入键:当我们找到第一个不大于key的元素时,或者当我们已经到达数组的开头(
j < 0),我们就在那个位置插入key(即arr[j+1] = key)。重复:这个过程一直重复,直到数组被完全排序。
打印结果:排序完成后,我们使用一个辅助方法
printArray来打印排序后的数组。
插入排序的平均时间复杂度和最坏时间复杂度都是,其中
是数组的长度。尽管它不是最高效的排序算法,特别是对于大数据集,但由于其简单性和在某些情况下的良好性能(如小数据集或基本有序的数据集),它仍然被广泛使用。

0条评论
点击登录参与评论