插入排序(Insertion Sort)是一种简单的排序算法,其基本思想与我们整理扑克牌的方式非常相似。我们将扑克牌从第二张开始依次与前面已排序的牌进行比较,将其插入到合适的位置,直到所有牌都有序。
插入排序是一种逐步构建有序序列的算法,每次从未排序部分中取出一个元素,并将其插入到已排序部分的合适位置。
插入排序的基本思想是逐步构建一个有序的序列。它将数组分为两部分:已排序部分和未排序部分。每次将未排序部分的第一个元素插入到已排序部分的合适位置,直到整个数组有序。
假设我们有以下无序数组:
[5, 2, 9, 1, 5, 6]插入排序的过程如下:
最终排序后的数组:[1, 2, 5, 5, 6, 9]
for i = 1 to n-1: // 从第二个元素开始
current = arr[i] // 当前元素
j = i - 1 // 已排序部分的最后一个元素
while j >= 0 and arr[j] > current: // 逐步向前查找插入位置
arr[j + 1] = arr[j] // 将大于当前元素的值向右移动
j -= 1
arr[j + 1] = current // 将当前元素插入合适位置for i = 1 to n-1):从第二个元素开始,逐步将当前元素插入到已排序的部分。while j >= 0 and arr[j] > current):比较当前元素与已排序部分的元素,并将大于当前元素的元素向右移动。插入排序的时间复杂度取决于输入数据的顺序。
插入排序只使用常数级的额外空间(只需一个临时变量来保存当前元素),因此它的空间复杂度是 O(1)。
import java.util.Arrays;
public class InsertionSort {
public static void insertionSort(int[] arr) {
// 从第二个元素开始
for (int i = 1; i < arr.length; i++) {
int current = arr[i]; // 当前元素
int j = i - 1; // 已排序部分的最后一个元素
// 查找插入位置
while (j >= 0 && arr[j] > current) {
arr[j + 1] = arr[j]; // 将大于当前元素的值向右移动
j--;
}
arr[j + 1] = current; // 插入当前元素
}
}
public static void main(String[] args) {
int[] arr = { 5, 2, 9, 1, 5, 6 };
System.out.println("Before sorting: " + Arrays.toString(arr));
insertionSort(arr);
System.out.println("After sorting: " + Arrays.toString(arr));
}
}输出:
Before sorting: [5, 2, 9, 1, 5, 6]
After sorting: [1, 2, 5, 5, 6, 9]while 循环,逐步将当前元素与已排序部分的元素进行比较,并向右移动大于当前元素的元素。插入排序是一种简单而有效的排序算法,适用于数据量较小或已经部分有序的情况。它的时间复杂度是 O(n²),因此在处理大规模数据时并不高效,但它是稳定的排序算法,并且实现非常简单。理解插入排序的过程和代码可以帮助我们更好地理解其他排序算法的实现和优化。