算法入门教程之一排序算法
大纲
前言
排序算法有很多种,常见的包括:
- 冒泡排序(Bubble Sort)
- 选择排序(Selection Sort)
- 插入排序(Insertion Sort)
- 归并排序(Merge Sort)
- 快速排序(Quick Sort)
- 堆排序(Heap Sort)
- 希尔排序(Shell Sort)
- 计数排序(Counting Sort)
- 桶排序(Bucket Sort)
- 基数排序(Radix Sort)
提示
- 编程四大基础:数据结构与算法、计算机网络、操作系统、设计模式。
插入排序
插入排序的介绍
插入排序类似于大多数人整理扑克牌的方式,如下图所示:
- (1) 手里只拿一张牌
- (2) 拿到下一张牌,并将其插入到正确的排序位置
- (3) 对所有牌重复上一步
尝试在示例数组 [6, 2, 10, 7]
上使用插入排序,其中排序动作执行的动画如下:
插入排序的实现
伪代码实现
1 | method insertionSort(array A[], integer N) |
- 外循环执行 N-1 次,这很明显。
- 但内循环执行的次数取决于输入:
- 在最好的情况下,数组已经排序并且
(a[j]> X)
总是为假。所以不需要移位数据,并且内部循环在 O (1) 时间内运行。 - 在最坏的情况下,数组被反向排序并且
(a[j]> X)
总是为真。插入始终发生在数组的前端,并且内部循环在 O (N) 时间内运行。
- 在最好的情况下,数组已经排序并且
- 因此,最佳情况的时间复杂度是 O (N × 1) = O (N) ,最坏情况的时间复杂度是 O (N × N) = O (N2)。
第一种写法
1 | public class InsertSortDemo { |
第二种写法
1 | public class InsertSortDemo { |