比较数据排序前后的查找次数
作者:宋科
作者主页:kesongemini.diy.163.com
下载本文源代码
题目:
随机产生 1000 个 1-2000 以内的互不相同的整数,
1)存储于一个数组中(不排序)
2)存储于一个数组中(排序)
分别应用查找运算,要求输入一个查找元素,输出各自的查找比较次数。
要求:
1)查找元素 2
2)查找元素 1000
目的:
练习一下C++的神仙眷侣所提倡的用“类”来表达观点的编程风格。
用类来思考:
查找(CFind)是一个概念,作用于特定的数据(CData),因为数据有各种不同的特性,有排序了的(CDataSorted),和没有排序过的(CDataChaos),对于不同特性的数据,应该应用不同的查找方法, 对于排序过的数据(CDataSorted),应该使用一种查找方法(CFindBinarySearch), 对于没有排序过的数据(CDataChaos),应该使用另一种查找方法(CFindWorker), 呵呵,所以产生了如下的类图:
+----------+ +-------+ + CFind +<>-------------------------->+ CData + +-+------+-+ +---+---+ ^ ^ ^ ^ ^ +--------+------+ ^ ^ ^ ^ +-----------+-+ +-+-----------------+ +-----+-------+ +---+--------+ + CFindWorker + + CFindBinarySearch + + CDataSorted + + CDataChaos + +-------------+ +-------------------+ +-------------+ +------------+这样的话,用户就可以通过派生CData类来加入新的存储格式的数据,通过派生CFind类来加入新的查找方法了, 不过,一般来说,查找方法都是和数据存储方式紧密耦合的,所以,嘿嘿嘿,..., 请注意我的目的呀,我只是为了练习C++才这样写的,哈哈:) 我想一定会有很多人大骂我白痴的吧,哈哈哈哈~~哈哈哈哈,就当耳旁风,不听。:)(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)
数据的基类:(每个类的实现请在本文提供的源代码中查找)
class CData{public:CData();CData(int iNum, int iMax); // generate the data : _vvirtual ~CData(){};CData(const CData& rhs);void get_data(vector& v);protected:vector _v;private:CData& operator=(const CData& rhs);const int _iMin;};排序数据类:
class CDataSorted : public CData{public:CDataSorted(CData rhs);virtual ~CDataSorted(){};private:CDataSorted();CDataSorted& operator=(const CDataSorted& rhs);};原始数据类:
class CDataChaos : public CData{public:CDataChaos(CData rhs);virtual ~CDataChaos(){};private:CDataChaos();CDataChaos& operator=(const CDataChaos& rhs);};查找的基类:
class CFind{public:CFind(const CData& data);virtual ~CFind();virtual bool to_find(int elem, int& num);protected:CData* _pdata;private:CFind& o