实验项目1:蛮力法与分治法应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验项目1:蛮力法与分治法应用
1、目的与要求:
实验目的:了解蛮力法和分治法的基本思想,学会运用蛮力法和分治法解决实际系统设计应用中碰到的问题。
实验要求:用蛮力法实现选择、冒泡排序,或旅行商问题、背包问题等问题(任选其中之一)。用分治法实现合并排序或快速排序。要求写出算法的伪代码描述,并编写程序实现之,相关算法放在函数实现,主程序给出测试用例,要设计足够多的相关测试用例,验证程序的正确性。注意观察程序执行结果和运行的时间。
实验报告要求给出问题定义及算法的伪代码描述,程序设计的代码,算法的测试用例及结果,并分析算法的时间效率,回答指导书中的思考题。
2、实验容:
(2)用分治法实现快速排序、合并排序算法。
本实验主要是用分治法实现合并排序,快速排序程序等。
合并排序算法描述:
MergeSort ( A[0...p-1] )
// input 待排序数组A[0..n-1]
// output 非降序排列的数组A[0..n-1]
if ( n>1 ) {//至少有2个元素
Copy A[0.. n/2-1 ] to B[0.. n/2-1 ];
Copy A[n/2..n-1 ] to C[0.. n/2-1 ];
MergeSort ( B[0.. n/2-1 ] );
MergeSort (C[0.. n/2-1 ]t);
Merge (B, C, A); //复制回数组a
快速排序算法描述:
QuickSort ( A[1.. r ] )
{
if (l QuickSort ( A[l..s-1] ); //对左半段排序 QuickSort ( A[s+1,r); //对右半段排序 } Partition ( A[l..r] ) { p=A[[l] ; i = l; j = r + 1; repeated repeated i=i+1; until A[i]> p // 将>= x的元素交换到左边区域 repeated i=i+1; until A[i]> p // <= x的元素交换到右边区域 Swap( A[i], A[j] ) Until i>j Swap( A[i] = a[j] ); Swap( A[l], A[j] ) return j; 要求先给出算法的伪代码,然后用C++或其他程序设计语言编写程序实现之,并设计相关的测试用例,验证程序的正确性。测试用例要求达到30个数据以上,或程序生成100个以上的数据,验证并说明程序的正确性。 上述实验项目是一般要求,的如学生水平较高,上述这些程序已经掌握,可以设计其他难度较高问题的算法和程序。如:hanoi 塔问题。 最后要求结合实验体会,分析算法的时间效率。 实验思考题:1、蛮力法的优缺点是什么?适用什么情况? 2、分治法的基本思想是什么?适用什么情况?说明分治法的优点 和局限性。 实验代码: #include using namespace std; inline void Swap(int &x,int &y) //交换x,y { int temp=x; x=y; y=temp; } int Partition(int a[],int p,int r) //通过一趟排序将要排序的数据分割成独立的两部分 //Partition 以确定一个基准元素a[q] 对子数组a[p:r]进行划分 { int i=p,j=r+1; int x=a[p]; //一部分的所有数据都比另外一部分的所有数据都要小 while(true) { while(a[++i] while(a[--j]>x); //将>x得元素交换到右边区域 if(i>=j) break; Swap(a[i],a[j]); //交换a[i],a[j] } a[p]=a[j]; a[j]=x; return j; //返回划分点 } void QuickSort(int a[],int p,int r) //利用递归进行快速排序 { if(p { int q=Partition(a,p,r); //Partition返回划分点j,此处使q=j q 为分裂点 QuickSort(a,p,q-1); //对左半段排序 QuickSort(a,q+1,r); //对右半段排序 } } int main() { int len; cout<<"请输入数组长度: "; cin>>len; int *a=new int[len]; //动态生成一个长度为len的数组cout<<"请输入一个数组: "; for(int i=0;i cin>>a[i]; QuickSort(a,0,len-1); //对数组进行快排 cout<<"排序后的数组是:"; for(int j=0;j