基本排序算法的分类及比较
首先,上一张各种排序算法比较的图
排序方法 | 平均时间复杂度 | 最好情况下的时间复杂度 | 最坏情况下的时间复杂度 | 空间复杂度(辅助存储) | 稳定性 |
---|---|---|---|---|---|
直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(n^1.5) | O(n) | O(n^2) | O(1) | 不稳定 |
直接选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | O(1) | 不稳定 |
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
快速排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | 不稳定 |
归并排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | O(1) | 稳定 |
其中又可以分为四个大类,即插入排序、选择排序、交换排序与归并排序
分类 | 插入排序 | 选择排序 | 交换排序 | 归并排序 |
---|---|---|---|---|
代表排序方法 | 直接插入排序、希尔排序 | 选择排序、堆排序 | 冒泡排序、快速排序 | 归并排序 |
插入排序
直接插入排序
原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序在实现上,通常采用in-place排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
代码实现如下:
public static void sort(int[] numbers){
for (int i = 1; i < numbers.length; i++) {
int currentNumber = numbers[i];
int j = i - 1;
while (j >= 0 && numbers[j] > currentNumber) {
numbers[j + 1] = numbers[j];
j--;