内容发布更新时间 : 2025/11/4 10:08:29星期一 下面是文章的全部内容请认真阅读。
算法设计与分析 实 验 指 导 书
实验一 C/C++环境及递归算法(4学时)
一、实验目的与要求
1、 熟悉C/C++语言的集成开发环境;
2、通过本实验加深对递归过程的理解 二、实验内容:
掌握递归算法的概念和基本思想,分析并掌握排列问题的递归算法和Hanoi塔问题的递归算法。 三、实验题
1、设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。任意输入一串整数或字符,输出结果能够用递归方法实现整数或字符的全排列。
2、设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。 四、实验步骤
1. 理解算法思想和问题要求; 2. 编程实现题目要求;
3. 上机输入和调试自己所编的程序; 4. 验证分析实验结果; 5. 整理出实验报告。 实验提示
1、#include 
inline void swap(int &a,int &b) {
int temp=a; a=b; b=temp; }
     void perm(int list[],int k,int m)      {  if(k==m)  {   for(int i=0;i<=m;i++)       cout<       swap(list[k],list[i]);      }      }        void main()      {        int list[3]={1,2,3};       perm(list,0,2);      }   2、void hanoi(int n, int a, int b, int c)    {         if (n > 0)        {            hanoi(n-1, a, c, b);           move(a,b);            hanoi(n-1, c, b, a);        }    }  实验二 分治算法(4学时)    一、实验目的与要求  1、熟悉二分搜索算法和快速排序算法; 2、初步掌握分治算法; 二、实验题  1、设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。设有n个不同的整数排好序后存放于t[0:n-1]中,若存在一个下标i,0≤i<n,使得t[i]=i,设计一个有效的算法找到这个下标。要求算法在最坏的情况下的计算时间为O(logn)。  2、在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。   三、实验提示  1、用I,j做参数,且采用传递引用或指针的形式带回值。 bool BinarySearch(int a[],int n,int x,int& i,int& j) {      int left=0;     int right=n-1;     while(left        int mid=(left+right)/2;         if(x==a[mid])        {             i=j=mid;            return true;        }          if(x>a[mid])            left=mid+1;        else             right=mid-1;     }      i=right;     j=left;      return false; }    int SearchTag(int a[],int n,int x) {      int left=0;      int right=n-1;     while(left        int mid=(left+right)/2;         if(x==a[mid]) return mid;         if(x>a[mid])            right=mid-1;        else             left=mid+1;     }      return -1; }   2、  template void QuickSort (Type a[], int p, int r) {        if (p         int q=Partition(a,p,r);          QuickSort (a,p,q-1); //对左半段排序         QuickSort (a,q+1,r); //对右半段排序         } }   template int Partition (Type a[], int p, int r) {          int i = p, j = r + 1;          Type x=a[p];          // 将< x的元素交换到左边区域         // 将> x的元素交换到右边区域         while (true) {             while (a[++i]