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 maxSiz
3、e;/数组最大长度 int n;/数组已有元素个数 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;Sortable
4、List: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:MergeSort() MergeSort(0, n - 1); void SortableList:QuickSort() QuickSort(0, n - 1); void SortableList:Me
5、rgeSort(int left, int right) if (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 = rig
6、ht) if (li = lj) tempk+ = li+; else tempk+ = 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 = Pari
7、tion(left, right); QuickSort(left, j - 1); QuickSort(j + 1, right); int SortableList:Parition(int left, int right) int i = left, j = right + 1; do do 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; S
8、ortableList my1(n); SortableList my2(n); my1.Input(); my2.Input(); my1.MergeSort(); my2.QuickSort(); my1.Output(); my2.Output(); 二、采用基于“五元中值组取中值分割法”(median-of-median-of-five partitioning)的线性 时间选择算法,找出 N 个元素集合 S 中的第 k个最小的元素,使其在线性时间内解决。标头.h#includeusing namespace std;enum ResultCode OutOfBounds,Succes
9、s;class SortableListpublic: SortableList(int mSize); SortableList(); void 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 rig
10、ht,int r);SortableList:SortableList(int mSize) maxSize = mSize; l = new intmaxSize; 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(i
11、nt i, int j) int c = li; li = lj; lj = c;int SortableList:Partition(int left, int right) int i = left, j = right + 1; do do 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
12、(k, 0,n - 1, 5); x = lj; return Success;int SortableList:Select(int k, int left, int right, int r) int n = 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);
13、/二次取中规则求每组的中间值 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; /
14、返回第k小元素下标 else if (kj - left + 1) return Select(k, left, j - 1, r);/在左子表求第k小元素 else return Select(k - (j - left + 1), j + 1, right, r); /在右子表求第k-(j-left+1)小元素 void SortableList:InsertSort(int left, int right) for (int i = left+1; i left & temp lj - 1) lj = lj - 1; j-; lj = temp; 源.cpp#include标头.hvoid main() int n = 10; int x = 4; SortableList myl(n); myl.Input(); myl.Select(x,4); myl.Output();四、实验小结(包括问题和解决方法、心得体会等)1、通过实现快排和两路合并排序,加深了对相关知识的理解。2、通过五元中值组取中值分割法在实际例子中体验了分治法的应用范围和优势。五、指导教师评语 成 绩批阅人日 期
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1