最近看《算法導論》(爲了ACM),當然作爲初學者,就先看看書上的僞代碼,然後自己去實現
看到書上有個二分排序算法,於是自己來實現,結果錯漏百出,遂發到MSDN論壇求助,一高手不吝賜教,按照
我的思路修改了代碼
然後我去看他的代碼,和自己寫的一對比,立刻感覺,原來算法如此美麗
自己還有刻苦努力纔可以
#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;
}