算法设计及分析实验指导书(2011) 下载本文

内容发布更新时间 : 2024/4/30 22:00:22星期一 下面是文章的全部内容请认真阅读。

算法设计与分析 实 验 指 导 书

实验一 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] x); if (i >= j) break; Swap(a[i], a[j]); } a[p] = a[j]; a[j] = x; return j; }