算法的美麗

最近看《算法導論》(爲了ACM),當然作爲初學者,就先看看書上的僞代碼,然後自己去實現

看到書上有個二分排序算法,於是自己來實現,結果錯漏百出,遂發到MSDN論壇求助,一高手不吝賜教,按照

我的思路修改了代碼

然後我去看他的代碼,和自己寫的一對比,立刻感覺,原來算法如此美麗

自己還有刻苦努力纔可以

 

#include<iostream>
#include
<vector>
#include
<algorithm>
using namespace std;
void Merge(vector<int> &ivec,int p,int q,int r)
{
    
int n1 = q - p, n2 = r - q+1;
    vector
<int> ivec1,ivec2; ////////////////兩個以排好序的序列
    for(int i=p;i!=q;++i)
        ivec1.push_back(ivec[i]);
    
for(int j=q;j!=r+1;++j)
        ivec2.push_back(ivec[j]);

    
int _i=0,_j=0,k=p;
    
for(;_i<n1&&_j<n2;++k)
    
{
        
if(ivec1[_i]<=ivec2[_j])
        
{
            ivec[k]
=ivec1[_i++];
        }

        
else
        
{
            ivec[k]
=ivec2[_j++];
        }

    }

    
while (_i<n1) ivec[k++= ivec1[_i++];
    
while (_j<n2) ivec[k++= ivec2[_j++];
}

void Merge_sort(vector<int> &ivec,int p,int r)
{
    
int q=(p+r)/2;   //////////////將序列分爲兩半,直到都只有一個元素開始排序
    if(p>=r) return;
    Merge_sort(ivec,p,q);
    Merge_sort(ivec,q
+1,r);
    Merge(ivec,p,q
+1,r);
}

int main()
{
    
int a[]={4,32,12,8,45,88,21,7,101};
    vector
<int> ivec(a,a+9);
    copy(ivec.begin(),ivec.end(), ostream_iterator
<int>(cout, " "));
    Merge_sort(ivec,
0,ivec.size()-1);
    copy(ivec.begin(),ivec.end(), ostream_iterator
<int>(cout, " "));
    cout
<<endl;
    
return 0;
}

 

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