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

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

这里写图片描述
所以在写代码的时候就要注意了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).

0 0
原创粉丝点击