当前位置:文档之家› 算法实验报告

算法实验报告

华北电力大学实验报告||实验名称算法设计与分析综合实验课程名称算法设计与分析||专业班级软件12 学生姓名:学号:成绩:指导教师:胡朝举实验日期:实验一分治策略—归并排序一、实验要求(1)编写一个模板函数:template <typename T>,MergeSort(T *a, int n);以及相应的一系列函数,采用分治策略,对任意具有:bool operator<(const T&x,const T&y);比较运算符的类型进行排序。

(2)与STL库中的函数std::sort(..)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题, 给出所用的时间比较。

二、实验代码#include <>#include <>#include <>#include <>#define MAX 50typedef struct {int arr[MAX+1];int length;}SortArr;SortArr *CreateSortArr() {int i = 0;char buf[4*MAX] = "";char *ptr = NULL;SortArr *sortArr = (SortArr *)malloc(sizeof(SortArr));memset(sortArr, 0, sizeof(SortArr));printf("请输入待排序数据,以逗号分隔,以分号结束\n" "input:");scanf("%s", buf);ptr = buf;sortArr->arr[i] = 0;i = 1;while(*ptr != ';') {sortArr->arr[i] = atoi(ptr);i++;ptr = strstr(ptr, ",");if(!ptr) { break; }ptr++;}sortArr->length = (i - 1);return sortArr; }int merge(int arr[], int p, int q, int r) {int i = 0;int j = 0;int k = 0;int n1 = 0;int n2 = 0;int *leftArr = NULL;int *rightArr = NULL;n1 = q - p + 1;n2 = r - q;leftArr = (int *)malloc((n1 + 2) * sizeof(int)); rightArr = (int *)malloc((n2 + 2) * sizeof(int)); for(i = 1; i <= n1; i++){leftArr[i] = arr[p+i-1];}for(j = 0; j <= n2; j++){rightArr[j] = arr[q+j];}i = 1;j = 1;leftArr[n1+1] = INT_MAX;rightArr[n2+1] = INT_MAX;for(k = p; k <= r; k++){if(leftArr[i] <= rightArr[j]){arr[k] = leftArr[i];i++;}else{arr[k] = rightArr[j];j++;}}free(leftArr);free(rightArr);return 0;}int mergeSort(int arr[], int p, int r){int q = 0;if(p < r){q = (p + r) / 2;mergeSort(arr, p, q);mergeSort(arr, (q+1), r);merge(arr, p, q, r);}return 0;}int MergingSortRecursion(SortArr *sortArr) {mergeSort(sortArr, 1, sortArr->length); return 0;}int PrintArray(SortArr sortArr){int i = 0;for(i = 1; i <= ; i++){printf("%d,", [i]);}printf("\b;\n");return 0;}int main(){SortArr *sortArr = NULL;sortArr = CreateSortArr();printf("\nBefore Sort:\t");PrintArray(*sortArr);MergingSortRecursion(sortArr);printf("Sorted Array:\t");PrintArray(*sortArr);free(sortArr);return 0;}实验二贪心算法—Huffman树及Huffman编码一、实验要求一个记录字符及出现频率的文件如下所示:,7,a,45,b,13,c,12,d,16,e,89,f,34,g,20试编写一个读取此种格式文件类CHuffman, 内部机制采用优先队列,用于建立Huffman树及进行Huffman编码输出,其用法可以如下所示:CHuffman hm("");();();();eight=weight[i];elsehaffTree[i].weight=0;arent=0;haffTree[i].flag=0;haffTree[i].leftChild=-1;haffTree[i].rightChild=-1;}eight<m1&&haffTree[j].flag==0){m2=m1;x2=x1;m1=haffTree[j].weight;x1=j;}else if(haffTree[j].weight<m2&&haffTree[j].flag==0){m2=haffTree[j].weight;x2=j;}}cout<<"i="<<i<<" "<<m1<<" "<<m2<<endl;arent=n+i;haffTree[x2].parent=n+i;haffTree[x1].flag=1;haffTree[x2].flag=1;haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}void HaffmanCode(HaffNode haffTree[],int n,Code haffCode[])eight;arent;eftChild==child)cd->bit[cd->start]=0;arent;}it[cd->start-j-1]=cd->bit[j];haffCode[i].start=cd->start;haffCode[i].weight=cd->weight;eight<<" Code=";tart+1;j<n;j++)for(j=0;j<myHaffCode[i].start;j++)cout<<myHaffCode[i].bit[j];m=m+myHaffCode[i].weight*myHaffCode[i].start;cout<<" 长度:"<<myHaffCode[i].start<<endl;}cout<<"huffman'sWPLis:";cout<<m;cout<<endl;return 0;}实验三用回溯方法求解n后问题一、实验要求问题:对任意给定的n求解n后问题。

具体要求:1.封装n后问题为类,编写以下两种算法进行求解:(1)递归回溯方法;(2)迭代回溯方法。

(选)2.对任意给定的n,要求输出其解向量(所有解),并输出其解数;参考类的封装如下:class CQueen{public:CQueen(); x[k-1]时,判断x[k] 能否放置void BackTrack(int t);n"<<endl;system("pause>nul");}实验四最大子段和问题的求解一、实验要求问题:对任意动态生成的n 个整数(可含负数),求最大子段及其和。

具体要求:1.采用至少三种方法进行求解:(1) 蛮力方法(枚举方法);(2) 分治策略;(3)动态规划方法。

2.对算法和数据进行类的封装,编写好构造函数和析构函数;3.对任意给定的n个整数,要求对以上的三种算法,都能够输出最大子段及其和。

注:教材中,对于分治策略及动态规划方法,并没有给出最大子段,只是给出了最大子段和;请注意在编写算法程序时的实现。

class CMaxSum{private:具体要求:1.将背包问题进行类的封装;2.能对任意给定的n种物品的重量、价值及背包限重,输出以上表格( 或纵向输出);3.输出背包问题的解;4.本题要求采用STL库中的排序算法数据进行排序。

二、实验代码#include <>struct goodinfo{float p; >goods[i].p){goods[i+1]=goods[i];i--;}goods[i+1]=goods[0];}}=0;cu=M; >cu)=1;cu=cu-goods[i].w;=cu/goods[i].w;lag<goods[i].flag){goods[i+1]=goods[i];i--;}goods[i+1]=goods[0];}cout<<"最优解为:"<<endl;for(i=1;i<=n;i++){cout<<"第"<<i<<"件物品要放:";cout<<goods[i].X<<endl;}}void main(){cout<<"|--------运用贪心法解背包问题---------|"<<endl;int j;int n;float M;goodinfo *goods;lag=i;cout<<"请输入第"<<i<<"件物品的重量:";cin>>goods[i].w;cout<<"请输入第"<<i<<"件物品的效益:";cin>>goods[i].p;goods[i].p=goods[i].p/goods[i].w;//得出物品的效益,重量比cout<<endl;}Insertionsort(goods,n);bag(goods,M,n);cout<<"press <1> to run agian"<<endl;cout<<"press <0> to exit"<<endl;cin>>j;}}三、实验总结本次算法综合实验要求的综合能力较高,需要对所学算法思想知识做到基本的融会贯通。

相关主题