2022更文挑战15-插入排序

114 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

插入排序

前文

插入排序是十分常见的一种排序算法,在实际的开发中会经常用到。本文为个人对于插入排序算法的一些总结,内容上难免有一些不足之处,还请见谅。

插入排序

插入排序算法整体上的思路是首先假设从排序数组最左边到当前n-1位置的数据为已排序状态。然后当对第n个数据进行排序操作时,将这个元素与前面的n-1个元素进行比较。由于前面的数据已经排序成功,因此只要找到适当的位置插入即可,不需要与剩余的元素继续进行比较。具体的操作时会将元素n左移,例如从小到大排序,那么需要找到第一个小于元素n的元素,并将元素n插入到该位置后一个位置即可。

简单看一个插入排序的代码:

public void sort(int[] list){
    for (int i = 1; i < list.length; i++) {
        int target = list[i];
        int pos = -1;
        for (int j = i - 1; j >= 0; j--) {
            if(list[j] >= target && j >= 0){
                list[j + 1] = list[j];
            }else{
                pos = j;
                break;
            }
        }
        if(pos + 1 > 0){
            list[pos + 1] = target;
        }
    }
    for (int i = 0; i < list.length; i++) {
        System.out.println(list[i]);
    }
}

插入排序的思路不需要额外的占用程序运行空间,因此空间复杂度为o(1)。但同样的,由于插入排序本质上来说可以认为是一个双循环结构。先对外层需要排序的数组结构进行遍历,同样的,对于每个循环到的元素,还需要利用该元素与该元素之前的子数组进行遍历比较。在讨论时间复杂度时,考虑到可能存在的完全倒序数组,需要对所有数据都进行移动操作,这种情况下会导致时间复杂度达到o(n^2)。但如果所有元素都是刚刚好拍排好的情况,对应的时间复杂度为o(n)。平均来说该排序算法的时间复杂度是o(n^2)。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。