• 插入排序------直接插入排序


     最优复杂度:当输入数组就是排好序的时候,复杂度为O(n),而快速排序在这种情况下会产生O(n^2)的复杂度。
     最差复杂度:当输入数组为倒序时,复杂度为O(n^2)           其实插入排序的复杂度和逆序对的个数一样,当数组倒序时,逆序对的个数为n(n-1)/2,因此插入排序复杂度为O(n^2)
     插入排序比较适合用于“少量元素的数组”。
      
     如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
     
    代码实现如下:
     

     

    插入排序的改进:二分插入排序

      对于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目,我们称为二分插入排序,代码如下:

    void InsertSort_Binary(RecType R[],int n)
    {
            int i,j,left,right,mid;
            RecType temp;
            for(i=1;i<n;i++)
            {
                   temp=R[i];
                   left=0;
                   right=i-1;   //初始化左右边界
                   while(left<=right)        //采用二分法查找新元素插入的位置
                   {
                           mid=(left+right)/2;
                           if(R[mid].key>temp.key)
                                 right= mid-1;
                           else
                                 left = mid+1;
                    }
                    for(j=i-1;j>0;j--)
                         R[j]=R[j+1];                //将新元素插入位置后面的元素像后移动一位
                    R[left]=temp;                   //插入新元素
              }
    
    }

      当n较大时,二分插入排序的比较次数比直接插入排序的最差情况好得多,但比直接插入排序的最好情况要差,所当以元素初始序列已经接近升序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列

  • 相关阅读:
    Step one : 熟悉Unix/Linux Shell 常见命令行 (三)
    Step one : 熟悉Unix/Linux Shell 常见命令行 (一)
    PLAN: step one
    PLAN : 入门题目 ( update )
    SZU : A11 Sequence
    SZU:B85 Alec's Eggs
    codeforces 518B. Tanya and Postcard 解题报告
    BestCoder8 1001.Summary(hdu 4989) 解题报告
    hdu 1556.Color the ball 解题报告
    codeforces 515C. Drazil and Factorial 解题报告
  • 原文地址:https://www.cnblogs.com/wujing-hubei/p/6129380.html
Copyright © 2020-2023  润新知