最近看《算法导论》(为了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;
}
#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;
}