1. 插入排序
1.1 排序原理
- 将数组分为两个区间,一个有序区间,一个无序区间。开始默认第一个元素为有序区间;
- 从无序区间取一个元素,在有序区间找到合适的位置将其插入;
- 重复这个过程,直到无序区间没有元素;
1.2 性能分析
1.2.1 执行效率
- 最小时间复杂度:数据完全有序时,只需进行一次遍历操作即可,时间复杂度是O(n);
- 最大时间复杂度:数据倒序排序时,需要n次插入操作,时间复杂度是O(n^2);
- 平均情况复杂度:时间复杂度是O(n^2);
1.2.2 空间复杂度
每次交换仅需1个临时变量,故空间复杂度为O(1),是原地排序算法。
1.2.3 算法稳定性
如果两个值相等,就不会交换位置,故是稳定排序算法。
1.3 代码实现
public static int[] insertSort(int[] a){ if (a.length <= 1) { return a; } // 默认第一个元素为有序区间,所以从第二个元素开始排序 for (int i = 1; i < a.length; i++) { int temp = a[i]; int j = i-1; /* 插入元素时,从后面的元素开始比较。 * 当 插入的元素 < 当前元素 时,将当前元素后移一位; * 继续比较 插入的元素 和 前面的元素; * 当插入元素 与 当前元素 不满足关系时,上一次比较肯定满足比较关系,且将当前元素已经复制到下一个位置; * 此时将插入元素直接插入此位置即可 */ for (;j >= 0;j--) { if (temp < a[j]) { a[j+1] = a[j]; } else { break; } } // 插入元素 a[j+1] = temp; } return a; }