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