1、学院(系)计算机学院专 业软件工程实验类型验证型(第4个实验密码算法是“设计型”)实验学时22017-3-30一、 实验目的和任务理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法 的算法原理及实现过程的理解二、 实验环境(实验设备)Visual Studio 2015三、实验原理及内容(包括操作过程、结果分析等)一、用分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排 序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。标头.h#includeusing namespace std;class SortableLis
2、tpublic: SortableList(int mSize); SortableList(); void Input();/输入数组 void Output();/输出数组 void MergeSort();/两路合并排序 void QuickSort();/快速排序private: int *l;/数组指针 int maxSize;/数组最大长度 int n;/数组已有元素个数 void MergeSort(int left, int right); void Merge(int left, int mid, int right); void Swap(int i, int j);/交换
3、函数 void QuickSort(int left, int right); int Parition(int left, int right);/分割函数;SortableList:SortableList(int mSize) maxSize = mSize; l = new intmaxSize; n = 0;SortableList() deletel;void SortableList:Input() cout 请输入待排序的数组n; for (int i = 0; i li; if (li = -1) break; n+; Output() n; i+) cout li Merg
4、eSort() MergeSort(0, n - 1);QuickSort() QuickSort(0, n - 1);MergeSort(int left, int right) if (left right) int mid = (left + right) / 2; MergeSort(left, mid); MergeSort(mid + 1, right); Merge(left, mid, right);Merge(int left, int mid, int right) int *temp = new intright - left + 1; int i = left, j =
5、 mid + 1, k = 0; while (i = mid) & (j = right) 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+;Swap(int i, int j) int c = li; li = lj; lj = c;QuickSort(int left, int right) int j = Parition(left
6、, 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 if (i j) Swap(i, j); while (i j); Swap(left, j); return j;源.app#include标头.hvoid main() int n = 10; SortableList my1(n); SortableList my2(n); my1.I
7、nput(); my2.Input(); my1.MergeSort(); my2.QuickSort(); my1.Output(); my2.Output(); 二、采用基于“五元中值组取中值分割法”(median-of-median-of-five partitioning)的线性 时间选择算法,找出 N 个元素集合 S 中的第 k个最小的元素,使其在线性时间内解决。enum ResultCode OutOfBounds,Success; ResultCode Select(int &x, int k); void InsertSort(int left, int right); int
8、 Partition(int left, int right); int Select(int k,int left,int right,int r);请输入带排序的数组nPartition(int left, int right)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;Select(int k, int left, int right, int r) int n
9、= right - left + 1;= r) /若问题足够小,使用直接插入排序 InsertSort(left, right); return left + k - 1; /取其中的第k小元素,其下标为left+k-1 for (int i = 1;= n / r; InsertSort(left + (i - 1)*r, left + i*r - 1); /二次取中规则求每组的中间值 Swap(left + i - 1, left + (i - 1)*r + (int)ceil(double)r / 2) - 1); /将每组的中间值交换到子表前部集中存放 /求二次中间值,其下标为j in
10、t j = Select(int)ceil(double)n / r / 2), left, left + (n / r) - 1, r); /二次中间值为枢纽元,并换至left处 j = Partition(left, right); /对表(子表)进行分划操作 if (k = j - left + 1) return j; /返回第k小元素下标 else if (k left & temp lj - 1) lj = lj - 1; j-; lj = temp;源.cpp int x = 4; SortableList myl(n); myl.Input(); myl.Select(x,4); myl.Output();四、实验小结(包括问题和解决方法、心得体会等)1、通过实现快排和两路合并排序,加深了对相关知识的理解。2、通过五元中值组取中值分割法在实际例子中体验了分治法的应用范围和优势。五、指导教师评语 成 绩批阅人日 期
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1