研究了三本书的归并排序的写法,
一:严蔚敏 数据结构;
写得太过于复杂,是这本书中写的最垃圾的算法,我一共研究过四遍吧,算法用错中复杂的参数和递归,令人看得非常头大。建议大家不要学习这本书的这个算法。因为是考研书,所以不得不看。
二:王红梅 算法设计与分析;
跟严蔚敏的书中算法差不多,不过该书漏了点东西,直接导致运算结果是错误的。所以不多说,这本书最多浏览一下其中的思想,不宜细看。因为是本人的的研究生课本,所以本人不得不研究。
三: Introduction to Algorithm
经典书籍,算法都是伪代码写的,不过基本上你有那么一点点编程基础的话,就可以非常容易的看懂并轻易把这些伪代码转换成为你熟悉的程序语言。其中的归并排序也是一目了然,很好懂。
下面给出严蔚敏的算法,下一遍文章再分析Introduction to algorithm的算法。比较一下这两个有什么不一样。
以下代码是本人简化了一点书本上的代码写成的。
#include<iostream>
using namespace std;
const int MAXS = 20;
void merge(int t1[], int t2[], int s, int m, int t)
{
int i=s, j=m+1, k=s;
while(i<=m&&j<=t)
{
if(t1[i]<=t1[j])
{
t2[k++]=t1[i++];
}
else
{
t2[k++]=t1[j++];
}
}
while(i<=m)
{
t2[k++]=t1[i++];
}
while(j<=t)
{
t2[k++]=t1[j++];
}
}
void mergeSort(int t1[], int t2[], int s, int t)
{
int m;
int tr[MAXS];
if(s==t) t2[s]=t1[s];
else
{
m = (s+t)/2;
mergeSort(t1, tr, s, m);
mergeSort(t1, tr, m+1, t);
merge(tr, t2, s, m, t);
}
}
template<typename T>
class Print
{
public:
Print(){}
void inline operator()(const T& x) const{cout<<x<<" ";}
};//这就是函数对象,这里并没有带数据,只是一个简单的输出操作。
template<class C, class Oper>
void for_all(C &c, Oper op)
{
for(auto x:c) //C++新特性,记住其实就是一种方便循环遍历数据的写法
op(x);
}/*写一个通用的函数,增加其可重用性,配合下面的Print函数就可以打印各种不同的数据到屏幕,非常方便。*/
int main()
{
int a[4]={5,2,90,8};
int b[7]={2,10,7,30,9,4,5};
int c[3]={9,5,8};
mergeSort(b, b, 0, 6);
for_all(b,Print<int>());
cout<<endl;
mergeSort(a, a, 0, 3);
for_all(a,Print<int>());
cout<<endl;
mergeSort(c, c, 0, 2);
for_all(c,Print<int>());
cout<<endl;
return 0;
}
总结:
以上代码还不完善,主要是想对比一下这两本书中的代码的异同,不然也不写这本书的代码了。不过能把这个代码看懂的话,说明你还是很聪明的,因为的确是写的非常复杂。如果是面试的时候,或者其他有压力的场合下写的话,恐怕很难调试出来,除非熟记了,要自己按照他的思路来写的话我觉得不太现实。所以还是集中精力学Introduction to Algorithm这本书的代码吧。