插入排序
插入排序(Insertion Sort)是一种简单的排序算法,其工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
工作原理
插入排序的基本思想是将一个记录插入到已经排好序的一系列元素中,可以形象地理解为类似打扑克牌时理牌的过程:
- 将数组分为“已排序”和“未排序”两部分;
- 初始时,“已排序”部分只有第一个元素,“未排序”部分包含其余所有元素;
- 取出“未排序”部分的第一个元素,在“已排序”部分从后向前比较;
- 如果该元素小于当前比较的元素,则将当前元素向后移动一位;
- 重复步骤4,直到找到已排序序列中其应该插入的位置;
- 将该元素插入到找到的位置;
- 重复步骤3至6,直到所有元素都已排序。
代码实现
查看代码
java
public class InsertionSort {
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;
// 将数组arr[0..i-1]中大于key的元素,向其当前位置的前方移动一个位置
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
public static void main(String[] args) {
int[] arr = {12, 11, 13, 5, 6};
System.out.println("原始数组:");
printArray(arr);
insertionSort(arr);
System.out.println("排序后的数组:");
printArray(arr);
}
static void printArray(int arr[]) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
}
时间复杂度
- 最好情况下的时间复杂度为
,当输入数组已经是排序好的时候; - 平均情况下的时间复杂度为
; - 最坏情况下的时间复杂度为
,当输入数组是以逆序的方式排列的时候。
空间复杂度
由于插入排序是原地排序算法,因此它只需要常数级别的额外空间