mightcell

导航

插入排序

插入排序

  • 原理
    • 第一步,保证\([0,0]\)区间元素有序,因为只有一个元素,所以不需要过多考虑
    • 第二步,保证\([0,1]\)区间元素有序,如果第二个元素与前一个元素逆序,则交换位置
    • 第三步,保证\([0,2]\)区间元素有序,如果第三个元素与前一个元素逆序,则交换位置,如果前面仍有元素,继续判断是否逆序直至没有元素或者呈顺序关系
    • ...

代码实现

public class Solution {
    public static void insertSort(int[] arr) {
        int len = arr.length;
        for (int i = 1; i < len; i++) {
            int newNumIndex = i;
            while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
                int temp = arr[newNumIndex];
                arr[newNumIndex] = arr[newNumIndex - 1];
                arr[newNumIndex - 1] = temp;
                newNumIndex--;
            }
        }
    }
}
  • 总结

    • 外层循环从索引\(1\)开始,因为第一步中的区间仅有一个元素不需要过多考虑
    • 内层循环可以改写:
    for (int j = 1; j <= i; j++) {
        if (arr[j - 1] > arr[j]) {
            int temp = arr[j - 1];
            arr[j - 1] = arr[j];
            arr[j] = temp;
        }
    }
    
  • 时间复杂度分析

    根据插入排序关键循环,有

    \[\sum\limits_{i=1}^{n-1}\sum\limits_{j=1}^{i}1=\sum\limits_{i=1}^{n-1}(i-1+1)=\frac{1}{2}n^2-\frac{1}{2}n \]

    因此,插入排序的时间复杂度为\(O(n^2)\)

posted on 2022-06-14 16:11  丹江口阿斯顿  阅读(19)  评论(0编辑  收藏  举报