• *直接插入排序


    首先,把书上的算法简化一下,直接用数组研究更直观。

    定义一个数组:

    int a[]={23,5,17,35,12,50,75,21};
    int length=sizeof(a)/sizeof(int); /* 计算长度 */

    它假设第一个元素是有序的,然后用第二个元素(下一个元素)和它进行比较,通过循环移动判定,得到一个有序列。
    得到一个有序列之后,再用下一个元素和这个有序列进行比较,这里的比较,就是局部比较,采用的是尾插法,从后往前。

    比如,前两个元素排成有序列后,得到:5 23,接着,用17和这个有序列比较,方式是从右到左。
    此处有个注意的地方,假如比较的数据一直小于有序列,可能会造成数组越界,所以在判定的时候要约束一下范围。
    下一个问题,一共比较的次数,这里应该是总长度-1,假如10个数据,需要比较9次。

    #include <iostream>
    using namespace std;
    int main(void)
    {
        int a[]={6,9,2,3,15,7,18,10,21};
        int length=sizeof(a)/sizeof(int);/*计算数组长度*/
        int j,e;
        for(int i=0;i<length-1;i++)
        {
            j=i; /*j等于有序列最右边的元素(末端)*/
            e=a[j+1];/*e总是等于下一个待排序的数*/
            while(j>-1 && e>a[j]) /*判定移动*/
          {
              a[j+1]=a[j];
              j--;
          }
          a[j+1]=e;/*在合适的位置插入数据,而且必定是在j+1的位置*/
        } 
        for(i=0;i<length;i++)
        cout<<a[i]<<" ";
        return 0;
    }

    记忆思路(四步):

    初始化j: j=i
    赋值e : e=a[j+1]
    循环移动 while()
    插入e a[j+1]=e;

    另外,书上采用关键字key,模型与之完全相同。但是,关键的还是模型,代码太多,有时根本无法记住,所以简化也是一种记忆的方式!

    书上代码参考:

    void InsertSort(SqList *L)
    /*直接插入排序*/
    {
        int i,j;
        DataType t;
        for(i=0;i<L->length-1;i++)        /*前i个元素已经有序,从第i+1个元素开始与前i个的有序的关键字比较*/
        {
            t=L->data[i+1];                /*取出当前待排序的元素*/
            j=i;
            while(j>-1&&t.key<L->data[j].key)/*寻找当前元素的合适位置*/
            {
                L->data[j+1]=L->data[j];
                j--;
            }
            L->data[j+1]=t;                /*将当前元素插入合适的位置*/
        }
    }
  • 相关阅读:
    ssh图示+hibernate图示
    spring Transactional
    Spring datasource
    sqlloader导入数据
    Spring Aop Annotation(@Pointcut)
    ajax传输文件+检验
    Spring Aop Annotation
    JDK的动态代理
    nginx代理gitlab
    python相关
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5248179.html
Copyright © 2020-2023  润新知