插入排序
1.基本思想:左侧的子序列总是有序的。对于每一个位置上的元素,将其与左侧已排序的部分进行比较并插入到合适的位置,直到整个序列有序
2.性能分析:
- 最好情况:如果输入数组已经是有序的,插入排序只需要进行n-1次比较(几乎不移动元素),时间复杂度为O(n)。
- 最坏情况:当输入数组完全逆序时,插入排序需要进行大约n(n-1)/2次比较和等量的交换或移位操作,时间复杂度为O(n^2)。
- 平均情况:时间复杂度也为O(n^2),空间复杂度为O(1)(原地排序)。
稳定性:插入排序是稳定的排序算法,相同的元素在排序后相对顺序不变
3.图片掩饰:
4.代码案例:
public class ChaRu_01 {public static void main(String[] args) {int[] a = { 8, 7, 6, 5, 4, 4, 3, 2, 1 };sortChar(a);for (int i = 0; i < a.length; i++) {System.out.print(a[i] + " ");}}public static void sortChar(int[] chars) {// 数组长度int length = chars.length;// 从第二个元素开始遍历for (int i = 1; i < length; i++) {// 当前元素int currentElment = chars[i];// 前一个元素的索引int leftIndex = i - 1;// 从当前元素的前一位依次像前遍历while (leftIndex >= 0 && currentElment < chars[leftIndex]) {// 将当前的位置的元素全部向后移动一位chars[leftIndex + 1] = chars[leftIndex];// 索引向前移动一位leftIndex = leftIndex - 1;}// 元素插入 +1的原因是索引移动到前位去了chars[leftIndex + 1] = currentElment;}}
}