排序算法——插入排序

介绍

插入排序是一种比较简单的排序方式通过将新的元素插入到已经排好的序列中来完成排序的目的。其最坏时间复杂度为\(O(n^2)\),最好时间复杂度为\(O(n)\),平均时间复杂度我为\(O(n^2)\). 是一种比较基础而又低效的排序算法,在数据量较小时可以使用,此外,插入排序是稳定的。


实现

步骤

  • 将数组第一个元素作为已排序序列。
  • 依次遍历后续元素,将每个元素与以排好序列中的元素依次比较,直到找到一个合适的位置将其插入进去。

图解

[17,5,23,12]排序。

17(0索引)视为已排序序列,从5(1索引)开始进行插入排序。

image-20210429231317261
image-20210429231317261

17比5更大,将5插入到17前面,现在已排序的元素为[5,17]

image-20210429231645763
image-20210429231645763

对元素23进行排列,23比17大,直接插到其后面,现在已排序数组为:[5,17,23]

image-20210429231939026
image-20210429231939026

最后是元素12,依次对比23,比其小,前移,再对比17,依然小,再前移,比5大,插入到5的后面,整个排序完成。

image-20210429232431402
image-20210429232431402

示例

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
public class InsertSort {
public static void main(String[] args) {
int[] arr = {92, 88, 49, 25, 76, 17, 61, 9, 10, 69};
int j;
int t;
for (int i = 1; i < arr.length; i++) {
j = i;
while (arr[j - 1] > arr[j]) {
t = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = t;
j--;
if (j == 0) {
break;
}
}
}
for (int i : arr) {
System.out.println(i);
}
}
}
[out]:
9
10
17
25
49
61
69
76
88
92
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def insertion_sort(a):
for i in range(1, len(a)):
j = i
while a[j - 1] > a[j]:
a[j - 1], a[j] = a[j], a[j - 1]
j -= 1
if j == 0:
break

return a


if __name__ == '__main__':
arr = [66, 93, 98, 96, 38, 8, 74, 56, 64, 51]
arr = insertion_sort(arr)
print(arr)

[out]:
[8, 38, 51, 56, 64, 66, 74, 93, 96, 98]