介绍
插入排序是一种比较简单的排序方式通过将新的元素插入到已经排好的序列中来完成排序的目的。其最坏时间复杂度为\(O(n^2)\),最好时间复杂度为\(O(n)\),平均时间复杂度我为\(O(n^2)\). 是一种比较基础而又低效的排序算法,在数据量较小时可以使用,此外,插入排序是稳定的。
实现
步骤
- 将数组第一个元素作为已排序序列。
- 依次遍历后续元素,将每个元素与以排好序列中的元素依次比较,直到找到一个合适的位置将其插入进去。
图解
对[17,5,23,12]
排序。
17(0索引)视为已排序序列,从5(1索引)开始进行插入排序。
17比5更大,将5插入到17前面,现在已排序的元素为[5,17]
对元素23进行排列,23比17大,直接插到其后面,现在已排序数组为:[5,17,23]
最后是元素12,依次对比23,比其小,前移,再对比17,依然小,再前移,比5大,插入到5的后面,整个排序完成。
示例
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]
|