插入排序(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条评论
点击登录参与评论