排序算法总结(2)--插入排序

原创 2017年05月18日 20:42:57

一、简介

插入排序对于少量元素的排序以及部分有序数组的排序,是一个有效的算法。插入排序的工作原理和整理一手扑克牌的过程一样。开始时,左手为空,每次从桌子上拿一张扑克牌并插入左手正确的位置。为了找到这张牌的正确位置,我们从右到左将它与手中的扑克牌比较,直到找到一张比它小的牌,将它插入这张牌的后面。此时手中所有的牌已经有序。在计算机实现中,为了要给插入的牌腾出位置,需要将一部分元素在插入之前右移。

二、伪代码

    算法:插入排序的非递归算法
    输入:未排序的数组 A
    输出:已排序的数组 A
    InsertionSort(A)
    for j=1 to A.length-1
        key=A[j];
        // 将array[j]插入到已排序的数组[1,...,j-1]中
        i=j-1;
        while i>=0 and A[i]>key
            A[i+1]=A[i];
            i=i-1;
        A[i+1]=key;

三、代码实现

public class Method {
    public static void main(String[] args) {
        int[] array={31,41,59,26,41,58};
        insertionSort(array);
    }

    public void insertionSort(int[] array){
        for (int j=1;j<array.length;j++){
            int key=array[j];
            // 将第j个元素插入前面排序好的序列里
            int i=j-1;
            while (i>=0 && array[i]>key) {
                array[i+1]=array[i];
                i--;
            array[i+1]=key;
            }
        }
    }   
}

四、复杂度分析

时间复杂度:
最好情况:O(n)
最坏情况:O(n^2)
平均情况:O(n^2)
空间复杂度:O(1),原址排序

五、注意事项

  1. 对于随机排列的长度为n且元素不重复的数组来说,最坏情况下需要大约n(n1)/2次比较和大约n(n1)/2次移动,最好情况下需要n1次比较和0次移动。
  2. 插入排序对于部分有序的数组效果很好。以下是几种典型的部分有序数组:
    (1). 数组中每个元素距离他最终的位置不远
    (2). 一个有序的大数组接一个小数组
    (3). 数组中只有几个元素的位置不正确
  3. 插入排序在一次循环之后不能确定任何一个元素的最终位置,直到所有元素排序好之才能确定元素的最终位置。

数据结构的排序算法总结与分析(完整代码)

此文涉及的算法包括1.插入排序1.1直接插入排序直接插入排序算法三点 (1)R[i]向前顺序查找,设置监视哨在R[0]位置 R[0]=R[i]; for(int j=i;R[0].Key...
  • sinat_26598193
  • sinat_26598193
  • 2017-07-23 17:48:38
  • 200

算法学习----各种排序算法的实现和对比2

算法学习----各种排序算法的实现和对比2
  • qyl10241024
  • qyl10241024
  • 2014-10-14 14:12:13
  • 504

js实现排序算法(冒泡、选择、插入、二分插入、快速、希尔)

插入排序从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步...
  • charlene0824
  • charlene0824
  • 2016-05-12 20:11:01
  • 6520

排序算法之三 2-路插入排序

这次要谈的插入排序算法就是2-路插入排序,2-路插入算法是在折半插入排序的基础上改进 它的目的就是想减少数据的移动次数,因此,另外开辟辅助空间。首先开辟一个长度为iLength的临时数组,将待排序数...
  • onedreamer
  • onedreamer
  • 2011-09-03 09:50:26
  • 6576

十二.C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序

一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的) /* Shell 排序法 */ #include void sort(int v[],int n) { ...
  • u011676589
  • u011676589
  • 2013-08-16 08:01:53
  • 1835

【图解算法】排序算法——插入排序

插入排序(insertion sorting) 大体含义是这样的,想我们在打扑克牌理牌时的思路一样,来一张扑克牌做一次插入操作。 下面我们给出普通版和优化版的插入排序 publi...
  • xiaoping0915
  • xiaoping0915
  • 2017-06-09 01:08:22
  • 312

数据结构与算法——插入类排序(直接插入排序,希尔排序)

一、直接插入排序 对于一个有序的序列,不断将后面的元素插入前面的有序序列,保持序列继续有序。 对于直接插入排序的思路:将要排序的元素保存,然后逐个和其前面的元素进行比较,如果前面的元素比其大,则将...
  • a879365197
  • a879365197
  • 2015-07-13 10:34:53
  • 653

【Java常用排序算法】插入排序(直接插入排序、希尔排序)

插入排序 直接插入排序 希尔排序
  • donggua3694857
  • donggua3694857
  • 2017-02-25 23:42:52
  • 1129

LUA 排序算法和性能分析[5]:插入排序算法

插入排序算法 时间开销:较长 稳定性: 复杂度: math.randomseed(os.time()); local real_print = print; local ...
  • warrially
  • warrially
  • 2017-12-20 14:25:39
  • 157

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

写在前面:                  排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。因此排序掌握各种排序算法非常重要。...
  • To_Be_IT_1
  • To_Be_IT_1
  • 2014-07-16 08:01:40
  • 5142
收藏助手
不良信息举报
您举报文章:排序算法总结(2)--插入排序
举报原因:
原因补充:

(最多只允许输入30个字)