分治算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析》实验报告
实验1 分治算法
一、实验目的
1、掌握分治算法的设计思想与分析方法;
2、掌握归并排序、快速排序等高效排序算法。
二、实验环境
1、硬件环境
CPU:Intel(R) Celeron(R) CPU 1007U @ 1.5GHz
内存:4G
硬盘:500G
2、软件环境
操作系统:Windows7
编程环境:Visual C++ 6.0
编程语言:C++
三、实验内容
1、编写程序,实现归并排序算法。
(1)归并排序算法
归并排序(Merge Sort)是利用“归并”技术来进行排序。归并是将若干个已排序的子序列合并成一个有序的序列,两路归并算法基本思路为设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high]。R[low..high]中。
合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针P加1。重复这一过程直至两个输入的子文件有一个已经全部复制完毕,此时将另一个非空的子文件中剩余记录一次复制到R1中即可。
(2)归并排序算法分析
时间复杂度:O(nlog2n)
空间复杂度:O(n)
(3)编程要求
●待排序数组长度至少为16,数组中可以有相同元素;
●按递增排序。
(4)程序代码(含注释)
#include
#define MAX_OF_ARRAY 20
//打印数据
void PrintArray(int *arrays)
{
for(int i=0;i { cout<<*arrays< arrays++; } } template void Merge(T c[],T d[],int l,int m,int r) { //把c[l:m]和c[m:r]归并到d[l:r] int i=l,j=m+1,k=l; while((i<=m)&&(j<=r)) { if(c[i]<=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; } //处理剩下未归并的 if(i>m) { for(int q=j;q<=r;q++) d[k++]=c[q]; } else { for(int q=i;q<=m;q++) d[k++]=c[q]; } } template void MergePass(T x[],T y[],int s,int n) { int i=0; while(i<=n-2*s) { Merge(x,y,i,i+s-1,i+2*s-1); i=i+2*s; } //剩下不足2S个元素 if(i+s { Merge(x,y,i,i+s-1,n-1); } else { for(int j=i;j<=n-1;j++) y[j]=x[j]; } } template void MergeSort(T a[],int n) { //使用归并排序算法对a[0:n-1]进行排序 T *b=new T[n]; int s=1;//段的大小 while(s { MergePass(a,b,s,n); s=s+s; MergePass(b,a,s,n); s=s+s; } delete [] b; } int main() { int IntArray[MAX_OF_ARRAY]={3,25,34,1,99,64,33,9,32,7,13,12,43,3,6,99,88,66,56,41}; MergeSort(IntArray,MAX_OF_ARRAY); PrintArray(IntArray); return 0; } (5)程序输出 2、编写程序,实现快速排序算法。 (1)快速排序算法 快速排序采用一种分治策略。其基本思想是将原问题分解为若干个规模更小但结构与原问题相似的子问题,递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。设当前待排序的无序区为R[low..high],用“分解—求解—组合”的办法解决问题。 分解:在R[low..high]中任选一个记录作为基准(Prvot),以此基准将当前无序区划分为左右两个较小的子区间R[low..pivotpos-1]和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于基准记录的关键字,而基准记录则位于正确的位置上,它无需参加后续的排序。 求解:通过递归调用快速排序对左、右子区间R[low..pivotpos]和R[pivotpos+1..high]快速排序。 组合:当“求解”步骤中两个递归调用结束时,其左右两个子区间已有序。对快速排序而言“组合”步骤无需作什么,可看作空操作。 (2)快速排序算法分析