数据结构 作业1
2020年春

目标：本次作业练习C++语言程序设计、算法时间复杂度分析，体会数据结构课程的学习目标


开始：
(1)解压hw1.rar，得到hw1文件夹。hw1文件夹包含一个hw1_2.xlsx、YourFib.h、PartitionPerf.h、YourPartition.h和hw1Test.cpp。

hw1_2.xlsx是作业1第2题的Excel文件，要求完成其中的表（1）、表（2）。第3小题 图（1）选作。

hw1Test.cpp文件中main（）函数的第一部分实现测试Fib类，第二部分实现测试Partition操作。

YourFib.h文件包含2阶斐波那契数列项Fib类的定义和（你的）实现。

YourPartition.h包含（你的）数组划分算法，算法中需要分别合计算法中元素移动次数、元素值比较次数和辅助空间字节数并返回。

PartitionPerf.h文件获取并输出数组划分算法性能数据，包括测试数据的生成、所耗时间的统计等。具体测试方法是分别对随机生成的大小为 5 - 600 （间隔为 5）的200个数组进行划分，累加所耗时间、元素移动次数、元素值比较次数和辅助空间字节数。程序会自动输出测试数据统计结果在Partition.txt中，请你将其中的数据分别粘贴在 https://docs.qq.com/sheet/DTFVNdlhqQVVDUU9L 四个汇总表中你的姓名位置相应处（hw1_4耗费总时间、hw1_4元素移动总次数、hw1_4元素移动总次数、hw1_4辅助空间总字节数）。

(2)建立一个空项目，添加hw1Test.cpp、fib.h、PartitionPerf.h、PartitionTest.cpp和YourPartition.h文件到项目中。

(3)任务hw1_3（选做)
fib.h中Fib类的成员函数Value()实现计算2阶斐波那契数列第n项数值的功能。要求你设计Value()函数，并把代码填在fib.h文件的Value()函数中。编译、链接、调试程序，直至运行结果正确。
    例如，测试用例如下
	n 	Fib(n)
	0	0
	1	1
	2	1
	3	2
	4	3
	5	5
	6	8
	7	13
	8	21
分析Value()函数的时间复杂度。

(4)任务hw1_4
已知整数数组Vector[0..n-1]，检测整个数组进行划分，以Vector[0]为基准元素，通过将小于基准的交换到左侧或大于基准的交换到右侧，将基准元素定位，并返回基准元素的位置。试编写YourPertition.h中的 int Partition(int x[], int n, int &movenum, int &compnum,int &bytesnum)函数实现划分，函数返回基准元素的定位位置，并统计算法中元素移动的次数、元素值比较的次数和使用辅助空间的字节数。其中movenum返回元素移动总次数，compnum返回元素值比较的总次数，bytesnum返回使用辅助空间的总字节数。

例如 数组： [20 23 66 23* 19 09]，n=6
处理后可能的数组状态1：[09 19] 20 [23* 23 66]， 返回值为2。
处理后可能的数组状态2：[19 09] 20 [23  23* 66]， 返回值为2。
处理后可能的数组状态3：[19 09] 20 [66  23* 23]， 返回值为2......

要求仅扫描数组一次。如果完成算法，进一步优化算法，使得算法使用更少的缓存和更少的元素移动次数、更少的元素值比较次数。

统计说明：
算法中如果Vector[i](0<=i<=n-1)出现在赋值号“=”两端，则movenum需累加一次。
调用一次swap函数，movenum需累加三次。
凡出现Vector[i]和Vector[j](0<=i,j<=n-1)比较大小，则compnum需累加一次。
凡出现定义辅助变量或数组，则bytesnum需累加相应的字节数。C++中sizeof(int)为4。

（5)编写你自己的readme.txt文件：按照结构体程序设计方法或面向对象程序设计方法 展示你的算法以及设计过程，分析Value()的时间复杂度，Partition()函数的时间复杂度和空间复杂度。
（6)压缩   hw1_2.xlsx+.h+.cpp+.exe+.dsw/.dsp+readme.txt+你的测试数据.txt 成包(.zip\.rar)。命名规则：班级-序号+姓名+作业1，提交到datastructurecp@163.com。


说明：
1、程序都在Visual Studio 2013 编译通过。
2、鼓励大家多思考多分析，做出自己想要的优化的程序和系统。
3、鼓励大家多查找学习网上资料、程序，并将它们整理、分享到群里。
4、鼓励大家勤交流、勤分享、勤讨论，以设计并实现出优化的程序和系统（但不分享代码！）。

