排序算法-插入排序

概述

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

平均时间复杂度

平均时间复杂度为O(n^2)

算法稳定性

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开 始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相 等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳 定的。

示例代码

/**
 * 插入排序
 * @author 吴庆龙
 * Date: 2018/8/2
 * Time: 9:54
 */
public class InsertSort {

    public static void main(String[] args) {
        int[] array = {7,3,2,4,1,8,0,9,5,6};
        sort(array);

        for (int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    private static void sort(int[] array) {

        // 获取最右边的下标
        int right = array.length - 1;

        for (int i = 1; i <= right; i++) {

            int key = array[i]; // 待排序的值
            int last = i - 1; // 已排序数组最大值的索引

            // 从最大值开始比较, 如果不成立, 则该位置即为应插入的位置, 退出循环
            for (; last >= 0; last--) {
                if (key <= array[last]) {
                    array[last + 1] = array[last];
                } else {
                    break;
                }
            }

            // 元素放入数组中
            array[last+1] = key;
        }

    }

}

插入排序是稳定的排序,取出待排序的数字,从已排序数组的最后一个数开始比较,如果待排序的数字小,则使用前一位数覆盖当前位的数。直到遇到比自己小的数

内部的查找最小(最大)数的遍历可以优化为二分查找

点赞