排序算法-插入排序

简介

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个形成一个有序表。在其实现过程使用双层循环,外层循环除第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

时间复杂度

O(n^2)

思路分析

排序规则:从小到大

在这里插入图片描述

  1. 有两个表,一张表A中存已排序好的(有序),默认放数组第一个元素。另一张表B中放未排序的元素
  2. 每次从B表中取第一个元素放入A表合适的位置,B中所有数据取出来后即排序完成。

具体可参考代码注释。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
java复制代码public class InsertSort {
public static void main(String[] args) {
int[] arr = {9, 2, 5, 3, 1};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}

public static void insertSort(int[] arr) {
// 排序规则:从小到大
// 1.有两个表,一张表A中存已排序好的(有序),默认放数组第一个元素。另一张表B中放未排序的元素
// 2.每次从B表中取第一个元素放入A表合适的位置,B中所有数据取出来后即排序完成。

for (int k = 1; k < arr.length; k++) {
// A表的索引 (while循环执行之前是A表中最后一个元素的索引)
int aIndex = k - 1;
// B表中取得数据
int bVal = arr[k];

while (
// 比较完A表中所有数据则退出循环
aIndex > -1
// 比较B表中取得元素和A表中元素比较
// 当B表中的元素比A表中的元素小时,则让当前A表中元素后移一位,前面一位预留给bVal
&& bVal < arr[aIndex]
) {
// 这里其实就是一个移动元素的过程,把当前元素移动到后一个位置,因为当前这个位置要预留给B中取出的元素
// 下列例子是模拟交换过程,没有按实际排序走,用于理解交换逻辑。
// int[] arr = {9, 2, 5, 3, 1};
// 假设 aIndex = 2
// arr[3] = arr[2] => {9, 2, 5, 5, 1}
// aIndex--;
// 下一次循环 aIndex = 1
// arr[2] = arr[1] => {9, 2, 2, 5, 1}
// aIndex--;
// 下一次循环 aIndex = 0
// arr[1] = arr[0] => {9, 9, 2, 5, 1}
arr[aIndex + 1] = arr[aIndex];
aIndex--;
}
// 如果当前索引变化了,意味着有序列表中有比bVal大的值,才赋值,
// 否则意味着A表中没有比bVal大的值,保持不动即可,也就是A表中的最后一个位置。(优化作用)
if (aIndex + 1 != k) {
arr[aIndex + 1] = bVal;
}
}
}
}

运行输出:

[1, 2, 3, 5, 9]

总结

在这里插入图片描述

该算法的核心其实就是拿B表中的第一个元素和A表中一个个比较,从A表中最后一个元素开始比较找到合适的位置放入,B表中的元素取完则排序完成。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%