专业课程实验报告
课程名称: 算法设计与分析
开课学期: 2016 至 2017 学年第 1 学期
专业:计算机科学与技术 年级班级: 2014级2班
学生姓名: 宋-- 学号:222014321210----
实验教师: 曹严元
计算机与信息科学学院 软件学院
实验项目名称 | 合并排序的非递归实现 | |||
实验时间 | 2016年9月20日 | 实验类型 | √验证性 □设计性 □综合性 | |
一、实验目的 1. 了解并掌握递归的概念,递归算法的基本思想; 2. 掌握分治法的基本思想方法; 3. 了解适用于用分治法求解的问题类型,并能用递归或非递归的方式设计相应的分治法算法; 4. 掌握分治法复杂性分析方法,比较同一个问题的递归算法与循环迭代算法的效率。 | ||||
二、实验要求 1. 预习实验指导书及教材的有关内容,掌握分治法的基本思想; 2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯; 3. 认真听讲,服从安排,独立思考并完成实验。 | ||||
三、实验内容与设计 1. 实现一个“由底向上”的归并分类算法,要求取消栈空间的需要。 (1) 选择合适的数据结构来表示问题; (2) 根据分治法的基本原理,写出归并分类问题的伪码算法; (3) 编制C++或JAVA等高级语言程序实现伪码算法; (4) 上机运行程序,验证算法的正确性,并分析算法的时空复杂性。 | ||||
四、实验结果分析及总结 实验结果:
实验内容: package security;
import java.util.Arrays; import java.util.Scanner; //归并排序的非递归算法 public class MergeSort{ public static void main(String args[]){ MergeSort mer = new MergeSort(); int[] array = mer.getArray(); System.out.println("原始数组:" + Arrays.toString(array)); mer.mergeSort(array); System.out.println("排序后数组:" + Arrays.toString(array)); }
public int[] getArray(){ Scanner cinNum = new Scanner(System.in); System.out.println("请输入需要排序的个数:"); int length = cinNum.nextInt();
int[] array = new int[length]; System.out.println("请输入数组内容:");
Scanner cinContent = new Scanner(System.in); for (int i = 0; i < array.length; i++) {// 初始化数组 array[i] = cinContent.nextInt(); } cinNum.close(); cinContent.close(); // System.out.println(Arrays.toString(array));// 打印确认正确无误
returnarray; }
public void mergeSort(int[] a){ int len = 1; while(len < a.length){ for(int i = 0; i < a.length; i += 2*len){ merge(a, i, len); } len *= 2; } }
public void merge(int[] a, int i, int len){ int start = i; int len_i = i + len;//归并的前半部分数组 int j = i + len; int len_j = j +len;//归并的后半部分数组 int[] temp = new int[2*len]; int count = 0; while(i < len_i && j < len_j && j < a.length){ if(a[i] <= a[j]){ temp[count++] = a[i++]; } else{ temp[count++] = a[j++]; } } while(i < len_i && i < a.length){ temp[count++] = a[i++]; } while(j < len_j && j < a.length){ temp[count++] = a[j++]; } count = 0; while(start < j && start < a.length){ a[start++] = temp[count++]; } } } 五、实验总结 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归归并。 经过本次实验,能够掌握分治法的基本思想,了解适用于用分治法求解的问题类型,能够用非递归的方式设计相应的分治法算法。对于归并算法的非递归实现,可以沿着递归实现的逆向方向去思考,递归的思想是自顶向下,将待排序序列不断分解,然后再归并。而非递归的思想就是自底向上,先两两归并,然后再4个4个一起归并,再8个。在这个过程中一定要注意尾部数据的处理,因为序列的长度不一定就是归并长度的整数倍。 归并排序的时间复杂度为O(n*log2n),空间复杂度为O(n),因而归并排序是一种稳定的排序方法。
| ||||
教 师 评 阅 | 实验成绩(A-E): 反馈评语: |