• 插入类的排序算法


    #include<stdio.h>
    /*
    * 插入排序算法 每天一道算法题 
    */
    void traverseArray(int *p,int length)
    {
       int i=0;
       for(;i<length;i++)
       {
         printf("%d\n",p[i]);
       } 
    
    }
    //直接插入排序 
    void insertSorted(int *p,int length)
    {
       int i,j,temp;
       for(i=1;i<length;i++)
       {
         if(p[i]<p[i-1])
         {
           temp=p[i];
           p[i]=p[i-1];
           for(j=i-2;j>-1&&temp<p[j];j--)
              p[j+1]=p[j];
           p[j+1]=temp;
         
         }
       }
    } 
    //折半插入排序 
    void BinsertSort(int *p,int length)
    {
      int i,j,temp,low,high,m;
      for(i=1;i<length;i++)
      {
        low=0; 
        high=i-1;
        temp=p[i];
        while(low<=high)
        {
           m=(low+high)/2;
          if(p[m]>temp)
              high=m-1;
          else 
              low=m+1; 
        }
        for(j=i-1;j>=high+1;j--)
          p[j+1]=p[j];
        p[j+1]=temp;  
      }
    }
    //希尔排序
    void ShellSort(int *p,int length,int dk)
    {
      int i,j,temp;
      for(i=dk;i<length;i++)
      {                  
        if(p[i-dk]>p[i])
        {
          temp=p[i]; 
          for(j=i-dk;j>-1&&p[j]>temp;j-=dk)
             p[j+dk]=p[j];
          p[j+dk]=temp;
        }
      }
    } 
    int main()
    {
      int a[]={3,2,1,4,5,7,9,8,6}; 
     // insertSorted(a,sizeof(a)/sizeof(int));
     // BinsertSort(a,sizeof(a)/sizeof(int));
      int i=4;
       for(;i>0;i--)
       {
        ShellSort(a,sizeof(a)/sizeof(int),i);
        traverseArray(a,sizeof(a)/sizeof(int));
        printf("\n");
       }
      traverseArray(a,sizeof(a)/sizeof(int));
      system("pause");  
    } 
    

     直接插入排序算法逆序比较的次数(n-2)(n+1)/2,需要移动的次数为(n+4)(n-1)/2,如果是正序的话,需要比较的次数为n-1,此时不需要移动,平均算法比较和移动的次数为n2/4,算法的时间复杂度为O(n2)。

       折半插入排序算法移动的次数和直接插入排序是相同的,比较的次数比直接插入排序减少,因此算法的时间复杂度为O(n2)。

       希尔排序的思想每次先把组内的顺序排好,然后再修改组的大小,直到为1为止。希尔排序最好的的时间复杂度为n1.3。

       插入类排序思想编程在于,每一次进行排序时,前面已经排序有序的,因此只要从后面往前面依次比较即可,需要注意内层循环的边界值,应该可以取到0值,否则第一个值就无法与后面的值进行比较。

      插入类排序适用于基本有序的序列,其为稳定类排序。

  • 相关阅读:
    弹性计算双周刊 第24期
    【阿里云新品发布·周刊】第8期:数字化风暴已经来临!云+区块链,如何颠覆未来科技?
    洞见数据库前沿 阿里云数据库最强阵容 DTCC 2019 八大亮点抢先看
    开发者招聘节 | 2019阿里巴巴技术面试题分享(陆续放出)
    bzoj1856: [Scoi2010]字符串
    bzoj1257: [CQOI2007]余数之和sum
    bzoj1088: [SCOI2005]扫雷Mine
    noip2015 运输计划
    noip2015 子串
    noip2015 斗地主
  • 原文地址:https://www.cnblogs.com/moshang/p/3948616.html
Copyright © 2020-2023  润新知