美文网首页
插入排序

插入排序

作者: 全狗 | 来源:发表于2019-01-12 06:48 被阅读0次

1、什么是排序

排序即是,输入包含n个数的数列(a_1,a_2,a_3,\cdots,a_n),通过某个过程生成数列(a'_1,a'_2,a'_3,\cdots,a'_n)
其中:a'_1<=a'_2<=...<=a'_n.

更一般的,可以表述为,使一个乱序的数列最终根据某种规则排列的过程,即是排序

2、插入排序

插入排序是一种排序方法。他的核心思想是,逐个的读取数列中的值,向该值前面的有序子数列插入。当数列读完的时候,整个数列也就排序完毕了

插入排序图

如上图所示,我们对数列(5,2,4,6,1,3)排序。比如我们已经读取到4这个数值,就将4插入(2,5)这个子有序数列中。最后,形成子数列(2,4,5)。后面的步骤以此类推,直到最后一个数值3

最终,形成数列(1,2,3,4,5,6)

2.1 代码实现(Java)

/**
 * @author: luzj
 * @date:
 * @description: 插入排序,增长率为O(n^2)
 * 0 从第二位开始进行比较排序,朝前面有序数列插入新值
 * 1 因此,每插入一个新值,就要遍历前面的有序数列,时间为O(n*n)
 * 2 在比较小的输入下,实际上使用插入反倒比快排、归并等经济
 */
public class InsertSort {

    void insertionSort(Integer[] A) {
        for (int j = 1; j < A.length; j++) {
            Integer key = A[j];
            //想象一下,将A[j]插到有序数列A[0...j-1]中去
            //如果A[j]大于A[j-1],那么A[j]就直接坐落于A[j]的位置,不要重排
            //若A[j]位于A[0...j-1]中,那么就逐个和A[j-1...0]比较,寻找合适的位置
            int i = j - 1;
            while (i >= 0 && A[i] > key) {
                A[i + 1] = A[i];
                i--;
            }
            A[i + 1] = key;
        }
    }

    //测试
    public static void main(String[] args) {
        Integer[] A= {5,2,4,6,1,3};
        new InsertSort().insertionSort(A);
        for (int i = 0; i < A.length; i++) {
            System.out.print(A[i]+" ");
        }
    }

}

2.2 时间复杂度

在最坏的情况下,插入排序的时间复杂性为:O(n^2)

最好的情况为:O(n),即当原始数列为有序数列的时候。由于我们不太可能针对有序数列排序,因此意义不大。

当排序数列比较小的时候,事实上,插入排序的性能反倒比快排等分治法策略的算法,还要好一些。而且还有简单易懂的特点

3、参考

相关文章

网友评论

      本文标题:插入排序

      本文链接:https://www.haomeiwen.com/subject/djdqdqtx.html