zoukankan      html  css  js  c++  java
  • 插入排序

    原理  

           从形象开始,先看下面这一张图。

        图 1:扑克牌理牌1
       这是大家玩扑克牌的摸牌阶段,我们使用左手拿着已经摸到并排好大小的牌,右手从牌堆里边摸牌,每摸一张牌就将其插入到左手理顺的牌中,插入后保持其大小顺序。
       再把这个过程抽象化,我们的扑克牌就是输入的待排序序列,两只手看成序列的两个部分。已经排序的和未排序的两部分,每次不断的从未排序的部分中取一个数,到已经排序的  部分中找到合适的位置插入。通常是自右向左依次比较来确定。

    实现  

            我们使用数组实现上面的过程。初始状态下,数组的首元素为已排序部分,从第二个元素开始插入排序。C语言的实现:
     

     1  void insertSort(int A[],int len)
     2    {
     3        int i,p,k;
     4        for(i=1;i<len;i++)
     5        {
     6            k = A[i];
     7            p = i-1;
     8            while(A[p]>k)
     9            {
    10                A[p+1] = A[p];
    11                p--;
    12            }
    13            A[p+1]=k;
    14        }
    15    }

    性能评估 

            在最糟糕的情况下,也就是序列逆序排列时,对于n-1个数中第x个数,每次将该数插入时将引起x-1次数组移动(这里不计算比较时间),求和得到 n(n-1)/2,很明显时间复杂度为O(n2)。


    1. 此图出自算法导论2.1中插入排序插图。

  • 相关阅读:
    如何进行Django单元测试
    django使用celery实现异步操作
    django 多并发,多线程。
    cookies设置时间
    Mysql实现企业级日志管理、备份与恢复
    Redis与Memcached的区别
    cookie 和session 的区别详解
    python内存泄露查找
    浙大月赛ZOJ Monthly, August 2014
    Vector
  • 原文地址:https://www.cnblogs.com/mike442144/p/3085531.html
Copyright © 2011-2022 走看看