二路插入排序的思考与代码实现

 二路插入排序,如果第一个作为比较划分为两个部分的那个关键字选得好的话,那么移动的次数就会减少很多,比较的次数也会减少很多,但是需要有n个空间辅助,忽然想起本科的数据结构老师说要么用时间换空间,要么用空间换时间,后来又听说现在计算机内存都够用的,感觉又跑偏了……,没办法受酱油师兄的影响实有点大,话语间总有他的风格。
 写这个程序的时候,有几点需要注意:
 1.final指针和first指针不一样,final指针指向具体的那个数字,而first指针指向具体数字前面的地址

二路插入排序的思考与代码实现_第1张图片
所以在写代码的时候就要注意了final指针是先改变指针再赋值,而first指针要先赋值在改变指针,
2.final指针是从小地址到大地址,而first指针是从大地址到小地址。所以这点是没有一次性作对的原因。

void TwoInsertSort(sqList L,int len)
{
    //利用有哨兵的那种情况进行的
    if(len<=1) return;
    int N=L.length;
    int d[9];
    int *first=&d[8];
    int *final=&d[1];
    d[1]=L.r[1];
    for(int i=2;i<=len;i++)
    {
        if(L.r[i]<d[1])
        {
            if(first==&d[8])//不知道这里可不可以一次表达
            {
                *first=L.r[i];
                //--first;
            }
            else
            {
                if(*(first+1)>=L.r[i])
                {
                    *first=L.r[i];
                    //--first;
                }//if
                else
                {
                    int *p;
                    for(p=first+1;*p<L.r[i];p++)
                        *(p-1)=*p;
                    *(p-1)=L.r[i];
                    //--first; 
                }//else

            }//else
            --first;    
        }//if
        else
        {
            if(*final<=L.r[i])
            {
                ++final;
                *final=L.r[i];

            }
            else
            {
                int *p;
                for(p=final;*p>L.r[i];--p)
                    *(p+1)=*p;
                *(p+1)=L.r[i];
                ++final;

            }
        }
    }
    int i=1;
    while(first<&d[8])
    {
        L.r[i]=*(first+1);
        ++first;
        ++i;
    }
    int j=1;
    while(final>=&d[j])
    {
        L.r[i]=d[j];
        ++j;
        ++i;
    }

    cout<<"自己写的二路插入排序,没有改变存储结构"<<endl;
    for(int i=1;i<=len;i++)
        cout<<L.r[i]<<" ";
    cout<<endl;
}

感觉自己写的代码有点冗长,很混乱,目前没有上网查,一定有简单的减少代码量的方法只是我还没有想到。感觉这个方法不是特别好,很多地方仍然用到了直接排序的思想。时间复杂度依旧是o(n2).

你可能感兴趣的:(数据结构,插入排序)