算法分治策略

上传人:壹****1 文档编号:470283126 上传时间:2022-07-16 格式:DOC 页数:9 大小:164.50KB
返回 下载 相关 举报
算法分治策略_第1页
第1页 / 共9页
算法分治策略_第2页
第2页 / 共9页
算法分治策略_第3页
第3页 / 共9页
算法分治策略_第4页
第4页 / 共9页
算法分治策略_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《算法分治策略》由会员分享,可在线阅读,更多相关《算法分治策略(9页珍藏版)》请在金锄头文库上搜索。

1、实 验 报 告(2016/2017学年 第二学期)课程名称算法分析与设计实验名称分治策略实验时间2017年3月30日指导单位计算机学院 软件工程系指导教师张怡婷学生姓名霍淇滨班级学号B15041236学院(系)计算机学院专 业软件工程实 验 报 告实验名称分治策略指导教师张怡婷实验类型验证型(第4个实验密码算法是“设计型”)实验学时2实验时间2017-3-30一、 实验目的和任务理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法 的算法原理及实现过程的理解二、 实验环境(实验设备)Visual Studio 2015三、实验原理及内容(包括操作过程、结果分析等)一、用

2、分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排 序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。标头.h#includeusing namespace std;class SortableListpublic:SortableList(int mSize);SortableList();void Input();/输入数组void Output();/输出数组void MergeSort();/两路合并排序void QuickSort();/快速排序private:int *l;/数组指针int maxSize;/数组最大长度int n

3、;/数组已有元素个数void MergeSort(int left, int right);void Merge(int left, int mid, int right);void Swap(int i, int j);/交换函数void QuickSort(int left, int right);int Parition(int left, int right);/分割函数;SortableList:SortableList(int mSize)maxSize = mSize;l = new intmaxSize;n = 0;SortableList:SortableList()dele

4、tel;void SortableList:Input()cout 请输入待排序的数组n;for (int i = 0; i li;if (li = -1)break;n+;void SortableList:Output()for (int i = 0; i n; i+)cout li ;void SortableList:MergeSort() MergeSort(0, n - 1); void SortableList:QuickSort() QuickSort(0, n - 1); void SortableList:MergeSort(int left, int right)if (

5、left right)int mid = (left + right) / 2;MergeSort(left, mid);MergeSort(mid + 1, right);Merge(left, mid, right);void SortableList:Merge(int left, int mid, int right)int *temp = new intright - left + 1;int i = left, j = mid + 1, k = 0;while (i = mid) & (j = right)if (li = lj) tempk+ = li+;else tempk+

6、= lj+;while (i = mid) tempk+ = li+;while (j = right) tempk+ = lj+;for (i = 0, k = left; k = right;)lk+ = tempi+;void SortableList:Swap(int i, int j)int c = li;li = lj;lj = c;void SortableList:QuickSort(int left, int right)if (left right)int j = Parition(left, right);QuickSort(left, j - 1);QuickSort(

7、j + 1, right);int SortableList:Parition(int left, int right)int i = left, j = right + 1;dodo i+; while (li lleft);if (i j) Swap(i, j); while (i j);Swap(left, j);return j;源.app#include#include标头.husing namespace std;void main()int n = 10;SortableList my1(n);SortableList my2(n);my1.Input();my2.Input()

8、;my1.MergeSort();my2.QuickSort();my1.Output();my2.Output(); 二、采用基于“五元中值组取中值分割法”(median-of-median-of-five partitioning)的线性 时间选择算法,找出 N 个元素集合 S 中的第 k个最小的元素,使其在线性时间内解决。标头.h#includeusing namespace std;enum ResultCode OutOfBounds,Success;class SortableListpublic:SortableList(int mSize);SortableList();voi

9、d Input();void Output();ResultCode Select(int &x, int k);private:int *l;int maxSize;int n;void Swap(int i, int j);void InsertSort(int left, int right);int Partition(int left, int right);int Select(int k,int left,int right,int r);SortableList:SortableList(int mSize)maxSize = mSize;l = new intmaxSize;

10、n = 0;SortableList:SortableList()deletel;void SortableList:Input()cout 请输入带排序的数组n;for (int i = 0; i li;if (li = -1)break;n+;void SortableList:Output()for (int i = 0; i n; i+)cout li ;void SortableList:Swap(int i, int j)int c = li;li = lj;lj = c;int SortableList:Partition(int left, int right)int i =

11、left, j = right + 1;dodo i+; while (li lleft);if (i j) Swap(i, j); while (i j);Swap(left, j);return j;ResultCode SortableList:Select(int &x, int k)if (n n | k = 0)return OutOfBounds;int j = Select(k, 0,n - 1, 5);x = lj;return Success;int SortableList:Select(int k, int left, int right, int r)int n =

12、right - left + 1;if (n = r) /若问题足够小,使用直接插入排序 InsertSort(left, right);return left + k - 1; /取其中的第k小元素,其下标为left+k-1 for (int i = 1; i = n / r; i+)InsertSort(left + (i - 1)*r, left + i*r - 1); /二次取中规则求每组的中间值 Swap(left + i - 1, left + (i - 1)*r + (int)ceil(double)r / 2) - 1); /将每组的中间值交换到子表前部集中存放/求二次中间值,其下标为j int j = Select(int)ceil(double)n / r / 2), left, left + (n / r) - 1, r);Swap(left, j); /二次中间值为枢纽元,并换至left处 j = Partition(left, right); /对表(子表)进行分划操作 if (k = j - left + 1)return j; /返回第k小元素下标 else if (kj - left + 1)return Select(k, left, j - 1, r);/在左子表求第k小元素

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号