Hello World

插入排序

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;
    }

 

posted @ 2019-03-06 22:23  小小忧愁米粒大  阅读(141)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书