二路插入排序的思考與代碼實現

 二路插入排序,如果第一個作爲比較劃分爲兩個部分的那個關鍵字選得好的話,那麼移動的次數就會減少很多,比較的次數也會減少很多,但是需要有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).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章