排序算法-插入排序(Java实现)

    直接插入排序是指从第二个数字开始从后往前插入,将当前数字依次与前面的数字进行比较,到最后一个数字完成了依次比较整个排序也就完成了。这个过程可以理解为在玩打牌游戏的时候,插牌的过程。
    我们知道这个排序需要两个循环,外层循环就是从第二个数字开始向后遍历,而内层循环就是把外层循环的当前数字与前面的数字依次比较,插入到合适的位置。
我们来举一组例子
在这里插入图片描述

  1. 因为一个数字就是有序的,所以我们从第二个数字开始插入,也就是现在我们有一个数字
    6
  2. 然后外层循环遍历到5这个数字,我们要把他插入到我们的序列中,我们选择从后开始比较,因为如果从前开始比较确定了位置后,我们要把后面所有的数字都往后覆盖,这样比较麻烦。5和6比较后,5小,所以将6往后挪一个位置,5继续往前比较,发现前面没有了,所以就把5放到这个位置,所以我们现在就成了
    5 6
  3. 现在我们插入了5,就该继续插入4,把4拿出来,依次与6和5进行比较,发现6大,所以6往后挪一位,5也大,继续挪,发现前面没有了,这下就把4放在该位置
    4 5 6
  4. 继续排序,拿到的是8,依次往前进行比较,发现8比较6,8大,所以把8再放回去,8的位置不变
    4 5 6 8
  5. …….依次类推,最终完成排序

代码实现:

    public static void insertSort(int[] array) {
        //定义一个临时变量
        int temp = 0;
        for (int i = 1; i < array.length; i++) {
            temp = array[i];
            int j;
            for (j = i-1; j >= 0 ; j--) {
                if(temp < array[j]) {
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = temp;
        }
    }

从分析中我们不难发现每次插入都是依次往前比较,所以这期间的交换都是挨着进行交换,所以算法是稳定的。

特点:
稳定

当我们的序列有序时,我们的插入排序是最快的,每次只需要比较一次就可以退出内层循环,所以算法时间最优为O(n)。如果每次的内层循环都要比较到最前面,也就是说序列是逆序的,这个时候的时间复杂度为O(n2)。这两种情况都是很极端的,我们的平均算法时间复杂度O(n2)。

最优时间复杂度:
O(n)
最坏时间复杂度:
O(n2)
平均时间复杂度:
O(n2)

在该过程中我们没有使用任何的辅助内存,所以空间复杂度为O(1)。

空间复杂度:
O(1)

猜你喜欢

转载自blog.csdn.net/weixin_42220532/article/details/88423596