深圳大学算法设计与分析杨煊实验一

合集下载

算法分析与设计实验一

算法分析与设计实验一

《算法分析与设计》实验报告

专业:计科班级:日期:2016/04/11 成绩:

学生姓名:学号:指导老师:

实验单元一递归设计

一、实验题目

实验一排序

二、实验目的

熟悉java语言(或C++)的集成开发环境;通过两种利用分治算法求解的排序算法来加深对递归设计和分治算法的理解。

三、实验内容

掌握递归算法的概念和基本思想,分析并掌握排列问题的递归算法。对于一个序列,使用快速排序算法和归并排序算法对其实现排序。

四、实验结果(代码及运行结果)

(一)快速排序源代码:

publicclass QuickSort {

publicstaticvoid main(String[] args) {

int[] data = newint[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };

print(data);

quickSort(data, 0, data.length - 1); // 调用快速排序方法

System.out.println("排序后的数组:"); // 打印输入函数

print(data);

}

/**

* 交换i、j位置数组中的内容(替代了新建临时变量)

*/

publicstaticvoid swap(int[] data, int i, int j) {

if (i == j) {

return;

}

data[i] = data[i] + data[j];

data[j] = data[i] - data[j];

data[i] = data[i] - data[j];

}

/**

* 快速排序核心方法

*/

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础

学号:**************

姓名:*************

班级:*************

日期:2014-2015学年第1学期

第九周

一、实验目的

1、理解递归的概念和分治法的基本思想

2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法

3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法

二、实验内容

任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。(30分)

2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。(30分)

3、设有n=2k个运动员要进行网球循环赛。设计一个满足要求的比赛日程表。(40分)

提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。

三、设计分析

四、算法描述及程序

五、测试与分析

六、实验总结与体会

#include "iostream"

using namespace std;

#define N 100

void Perm(int* list, int k, int m)

{

if (k == m)

{

for (int i=0; i<m; i++)

cout << list[i] << " ";

cout << endl;

return;

}

else

{

for (int i=m; i<k; i++)

{

swap(list[m], list[i]);

《算法设计与分析》课件

《算法设计与分析》课件

3
空间复杂度分析方法
空间复杂度分析通常采用递归树和分治法等。
算法复杂度实例分析
排序算法的时间复杂度分析
常见的排序算法如冒泡排序、选择排序和快速排序的时间复杂度分别为O(n^2)、O(n^2) 和O(nlogn)。
二分查找算法的时间和空间复杂度分析
二分查找算法的时间复杂度为O(logn),空间复杂度为O(1)。
空间换时间 分治策略 贪心算法 动态规划
通过增加存储空间来减少计算时间,例如使用哈希表解决查找 问题。
将问题分解为若干个子问题,递归地解决子问题,最终合并子 问题的解以得到原问题的解。
在每一步选择中都采取当前状态下最好或最优(即最有利)的 选择,从而希望导致结果是最好或最优的。
通过将问题分解为相互重叠的子问题,并保存子问题的解,避 免重复计算,提高算法效率。
贝叶斯网络
基于概率的图形化模型,用于 不确定性推理、决策支持系统
等。
THANKS
02 常见算法设计方法
分治算法
分治算法是一种将问题分解为 若干个子问题,递归地解决子 问题,并将子问题的解合并以 得到原问题的解的算法设计方
法。
归并排序、快速排序和堆排序 等常见算法都是采用分治算法
设计的。
分治算法的核心思想是将问题 分解为若干个子问题,通过解 决子问题来求解原问题,子问 题的解的合并方式决定了整个 问题的解决方案。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告

实验一全排列、快速排序

【实验目的】

1. 掌握全排列的递归算法。

2. 了解快速排序的分治算法思想。

【实验原理】

一、全排列

全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何n个字符集的排列都可以与1~n的n个数字的排列一一对应,因此在此就以n 个数字的排列为例说明排列的生成法。

n个字符的全体排列之间存在一个确定的线性顺序关系。所有的排列中除最后一个排列外,都有一个后继;除第一个排列外,都有一个前驱。每个排列的后继都可以从它的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。

二、快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再

按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

【实验内容】

1.全排列递归算法的实现。2.快速排序分治算法的实现。

【实验结果】

1. 全排列:

2. 快速排序:

实验二最长公共子序列、活动安排问题

【实验目的】

1. 了解动态规划算法设计思想,运用动态规划算法实现最长公共子序列问题。2. 了解贪心算法思想,运用贪心算法设计思想实现活动安排问题。

【实验原理】

一、动态规划法解最长公共子序列

设序列X=和Y=的一个最长公共子序列Z=,则:

i. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;

算法设计与分析实验教学大纲

算法设计与分析实验教学大纲

《算法设计与分析》实验教学大纲

(2007年修订)

课程代码:0502121014,0504321013

课程性质:非独立设课课程分类:专业课程

实验学分: 1 学分实验学时:36

适用专业:计算机科学与技术开课单位:数学与计算机科学学院计算机网络管理

一、实验教学目标

《算法设计与分析》旨在教会学生处理各种问题的方法,而通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。只有通过实验,学生才能判定自己所拟算法是否正确,是否算得上一个较优算法。

通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识。同时培养学生的实际动手能力,加强学生创新思维能力的培养。

二、主要仪器设备名称

计算机、C语言或C++语言。

三、实验基本要求

《算法设计与分析》是计算机专业的专业核心课程,其先修课程有数据结构和至少一门高级语言。

算法设计与分析课程将覆盖计算机软件实现中的大部分算法,并具有一定的深度和广度,使学生对计算机常用算法有一个全盘的了解;通过此课的学习,学生应该具有针对所给的问题设计和实现高效算法的能力。通过上机

实验,将使学生熟悉、掌握课堂教学中所学的大部分算法。

同时,上机实习是对学生在软件设计方面的综合训练,包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧等,以培养良好的编程风格和科学作风。通过理论联系实际,以最终提高学生动手操作的能力以及分析问题的能力。

四、实验项目设置与内容

五、实验考核

结合平时实验过程中的程序调试、实验报告,期末进行上机考试,实验成绩占课程总成绩的20%。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析报告

学生姓名

学号

专业班级

指导教师

完成时间

目录

一、课程内容 (3)

二、算法分析 (3)

1、分治法 (3)

(1)分治法核心思想 (3)

(2)MaxMin算法分析 (3)

2、动态规划 (4)

(1)动态规划核心思想 (4)

(2)矩阵连乘算法分析 (5)

3、贪心法 (5)

(1)贪心法核心思想 (5)

(2)背包问题算法分析 (6)

(3)装载问题算法分析 (7)

4、回溯法 (7)

(1)回溯法核心思想 (7)

(2)N皇后问题非递归算法分析 (7)

(3)N皇后问题递归算法分析 (8)

三、例子说明 (9)

1、MaxMin问题 (9)

2、矩阵连乘 (10)

3、背包问题 (10)

4、最优装载 (10)

5、N皇后问题(非递归) (11)

6、N皇后问题(递归) (11)

四、心得体会 (12)

五、算法对应的例子代码 (12)

1、求最大值最小值 (12)

2、矩阵连乘问题 (13)

3、背包问题 (15)

4、装载问题 (17)

5、N皇后问题(非递归) (19)

6、N皇后问题(递归) (20)

一、课程内容

1、分治法,求最大值最小值,maxmin算法;

2、动态规划,矩阵连乘,求最少连乘次数;

3、贪心法,1)背包问题,2)装载问题;

4、回溯法,N皇后问题的循环结构算法和递归结构算法。

二、算法分析

1、分治法

(1)分治法核心思想

当要求解一个输入规模为n,且n的取值相当大的问题时,直接求解往往是非常困难的。如果问题可以将n个输入分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1

那末,这类问题可以用分治法求解。

《算法设计与分析》实验指导书

《算法设计与分析》实验指导书

《算法设计与分析》实验指导书

本文档主要用于《算法设计与分析》课程的实验指导。《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。

通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。

本课程设计了7个设计型实验。实验内容包括用分治法、动态规划、贪心法、回溯法以及分支限界法求解问题。

一、实验内容安排

二、实验基本要求

实验前要求学生一定要先了解实验目的、内容、要求以及注意事项,要求学生熟悉实验对象,设计并编写相应的算法。学生应独立完成所布置实验内容,编写代码,运行程序,记录结果并撰写实验报告。

三、实验报告要求

实验结束后,应及时整理出实验报告,实验报告提交书面文档。

四、考核方式

理论考试(60%)+实验(30%)+作业(10%)

五、实验内容与指导

实验一快速排序问题

1.实验目的

(1) 用分治法求解该问题。

2.实验环境

PC机,要求安装Eclipse软件或VC++软件供学生实验。

3.实验内容

有n个无序的数值数据,现要求将其排列成一个有序的序列。

4. 实验步骤

(1) 输入实现该问题的源代码;

(2) 输入测试数据,验证代码的正确性。

5.实验要求

(1)做好实验预习,熟悉本实验中所使用的开发环境。

(2)写出实验报告

①实验目的

②实验内容

③出错信息及处理方法

④实验结果

实验二最少硬币问题

1.实验目的

(1) 用动态规划求解该问题。

算法分析与设计课程实验报告

算法分析与设计课程实验报告

算法分析与设计课程实验报告

班级: 131213

学号: 13121XXX

姓名: XXX

指导老师:邓凡

目录

算法分析与设计课程实验报告 (1)

实验一排序 (1)

1. 课本练习2.3-7 (1)

2. 实现优先队列 (2)

3.快速排序 (2)

4. 第k大元素 (3)

实验二动态规划 (4)

1. 矩阵链乘 (4)

2. 最长公共子序列 (5)

3. 最长公共子串 (7)

4. 最大和 (9)

5. 最短路径 (10)

实验三贪心策略 (11)

1. 背包问题 (11)

2. 任务调度 (14)

3. 单源点最短路径 (15)

4. 任意两点间最短路径 (16)

实验四回溯法 (18)

1. 0-1背包问题 (18)

2. 8-Queen问题 (21)

实验一排序

1.课本练习

2.3-7

(1)问题描述

描述一个运行时间为 (nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好是x的元素。

(2)问题分析

该问题首先要进行排序,然后用二分查找法判断S中是否存在两个其和刚好是x的元素,因为时间复杂度为(nlgn),所以可以采用归并排序。

(3)算法分析

归并排序的思想是将n个元素分成各含n/2个元素的子序列,然后对两个子序列递归地进行排序,最后合并两个已排序的子序列得到排序结果。二分查找的思想是对于集合中的每一个数字,用二分法找到x-S[i]的位置,若存在且不为其本身,则输出S中存在有两个和等于x的元素;否则,不存在。

(4)实验结果

2.实现优先队列

(1)问题描述

实现优先队列,维护一组元素构成的集合S。

深圳大学算法设计与分析杨煊实验三

深圳大学算法设计与分析杨煊实验三

深圳大学实验报告

课程名称:算法设计与分析

实验项目名称:高斯消元

学院:

专业、班级:

指导教师:杨烜

报告人:学号:

实验报告提交时间: 2015.5.15

教务处制

一、实验目的

1.掌握变治法思想。

2.学会高斯列主元消去法及其应用。

二、实验内容

1. 高斯列主元消去法求解线性方程组。

2. 高斯列主元消去法判断矩阵是否可逆?需要说明理由,如果可逆,求出其逆矩阵。

三、实验原理

算法:GaussElimination(A[1...n,1...n],b[1...n])

//用部分选主元法实现高斯消去法

//输入:矩阵A[1...n,1...n]和列向量b[1...n]

//输出:一个代替A的上三角形等价矩阵图,相应的右边的值位于第(n+1)列中for i<-1 to n do A[i,n+1]<-b[i] //把b作为最后一列添加到A中

for i<-1 to n-1 do

pivotrow<-i

for j<-i+1 to n do

if |A[j,i]|>|A[pivotrow,i]|

pivotrow<-j

for k<-i to n+1 do

swap(A[i,k],A[pivotrow,k])

for j<-i+1 to n do

temp<-A[j,i]/A[i,i]

for k<-i to n+1 do

A[j,k]<-A[j,k]-A[i,k]*temp

算法:GaussBackSub(A[1...n,1...n+1])

//实现高斯消去法的反向替换

算法分析实验一报告

算法分析实验一报告

《算法设计与分析》实验报告

目录

一、实验内容描述和功能分析.

二、算法过程设计.

三、程序调试及结果(附截图).

四、源代码(附源代码).

一、实验内容描述和功能分析.

1.彼岸

内容描述:突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。

现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei 必定会在该空间上碰到一种颜色的珠子。如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。

比如经过长度为3的悬崖,碰到的珠子先后为“红黄蓝”,或者“蓝红黄”等类似情况就会坠落,而如果是“红黄红”或者“红黄黄”等情况则可以安全到达。

现在请问:yifenfei安然抵达彼岸的方法有多少种?

输入:输入数据首先给出一个整数C,表示测试组数。

然后是C组数据,每组包含一个正整数n (n<40)。

输出:对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。

每组输出占一行。

例如:输入:2 输出:9

2 21

3

2.统计问题

内容描述:在一无限大的二维平面中,我们做如下假设:

1、每次只能移动一格;

2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);

3、走过的格子立即塌陷无法再走第二次;

求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。

《算法设计与分析》实验大纲

《算法设计与分析》实验大纲

《算法设计与分析》实验教学大纲

实验学时:32 实验个数:7 实验学分:1

课程性质:适用专业:计算机科学与技术、软件工程

教材及参考书:

1.《计算机算法设计与分析》,王晓东,北京:电子工业出版社,2005年

2.《算法与数据结构》,傅清祥等著,北京:电子工业出版社,2003

3.《计算机算法导引—设计与分析》,卢开澄著,北京:清华大学出版社,2001 大纲执笔人:刘芳大纲审定人:郭涛

一、实验课的性质与任务

算法的设计与分析是计算机科学的核心问题之一,也是计算机科学与技术专业本科及研究生的一门重要的专业基础课,其内容是研究计算机领域及其有关领域中的一些非数值计算的常用算法。课程将覆盖计算机软件实现中常用的、有代表性的算法,并具有一定的深度和广度,通过实验,使学生理解并掌握算法设计的基本技术,让学生具有针对所给的问题设计和实现高效算法的基本能力。

二、实验课程目的与要求

计算机科学的一个核心问题是算法理论,本课程介绍非数值算法设计的策略与技术,同时介绍算法的复杂性的概念通过对一些代表性算法的使用达到了解掌握与运用的目的。

通过完成课程实验,使学生达到如下要求:

1.熟悉各种基本常用算法的基本思想、适用范围,初步掌握算法分析的基本技巧

以及如何根据实际问题设计一个有效的算法。

2.能对给定问题分析出恰当的数学模型,并设计出解决方案,将算法用高级语言

(C,VC++等)编程实现。

三、实验内容安排:

实验一算法设计基础

(验证型、设计型实验4学时)

1.实验目的

(1)巩固程序设计语言基础知识,熟悉文件操作等。

(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。

算法实验一实验报告

算法实验一实验报告

武汉轻工大学

数学与计算机学院

算法分析实验报告

指导老师:汤小月

专业:信息管理与信息系统

班级:信管1201班

学号:

姓名:

实验一分治与递归(2学时)

一、实验目的与要求

1、熟悉C/C++语言的集成开发环境;

2、通过本实验加深对递归过程的理解

二、实验内容:

掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。

三、实验题

任意输入一个整数,输出结果能够用递归方法实现整数的划分。

具体程序代码如下:

#include<iostream>

using namespace std;

int q(int n,int m) //正整数n的最大加数m的划分数

{

if((n<1)||(m<1)) return 0; //n,m需>1

if((n==1)||(m==1)) return 1; //正整数或者最大加数=1时,只有一种划分情况

if(n<m) return q(n,n); //最大加数实际不能大于正整数本身

if(n==m) return q(n,m-1)+1; //递归,n的划分由其q(n,m-1)和n1=n组成

return q(n,m-1)+q(n-m,m); //正整数n的最大加数n1不大于m的划分由n1=m的划分和n1=m-1的划分组成

}

void main()

{

int n,m;

cout<<"请输入一个整数n(-1退出):"<<endl;

cin>>n;

while(n>=1)

{

cout<<"请输入一个最大加数m:"<<endl;

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一

实验名称统计数字问题评分

实验日期2014 年11 月15 日指导教师

姓名专业班级学号

一.实验要求

1、掌握算法的计算复杂性概念。

2、掌握算法渐近复杂性的数学表述。

3、掌握用C++语言描述算法的方法。

4.实现具体的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容

统计数字问题

1、问题描述

一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)

2、编程任务

给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2, (9)

三.程序算法

将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。把这些结果统计起来即可。

四.程序代码

#include<iostream.h>

int s[10]; //记录0~9出现的次数

int a[10]; //a[i]记录n位数的规律

void sum(int n,int l,int m)

{ if(m==1)

{int zero=1;

for(int i=0;i<=l;i++) //去除前缀0

{ s[0]-=zero;

深圳大学算法设计与分析杨煊实验一

深圳大学算法设计与分析杨煊实验一

深圳大学实验报告

课程名称:算法设计与分析

实验项目名称:排序算法性能分析

学院:

专业、班级:

指导教师:**

报告人:学号:

实验报告提交时间: 2015.4.3

教务处制

一、实验目的与实验环境

实验目的:

1. 掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理

2. 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。

实验环境:VC++ 6.0

二、实验原理与算法描述

算法(1)选择排序 SelectSort(A[0...n-1],n)

//利用选择排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

for i<-0 to n-2 do

min<-i

for j<-i+1 to n-1 do

if A[j]<A[min]

min<-j

swap A[i] and A[min]

理论效率:C(n) ∈θ(n^2),不稳定算法

算法(2)快速排序 QuickSort(A[0...n-1],n)

//利用快速排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

if l<r

s<-Partition(A[l...r]) //s是分裂位置

Quicksort(A[l...s-1])

Quicksort(A[s+1...r])

Partition(A[l...r])

//以第一个数为中轴,对子数组进行分区

//输入:数组A[0...n-1]中的子数组A[l...r],由左右下标l和r定义 //输出:数组A[l...r]的一个分区,分裂点的未知作为函数的返回值p<-A[l]

实验一 简单算法设计

实验一 简单算法设计

实验一简单算法设计

一.实验目的和要求

1. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程;

2. 掌握简单问题的算法设计与分析,能设计比较高效的算法;

3. 熟悉C/C++语言等的集成开发环境,掌握简单程序设计与实现的能力;

二.实验内容

(一)相等元素问题

1.问题描述先排序函数,再查找函数。

#define size 100

Typedef strat

{

Int Array[size]

Int listlength

}List

List a;

Main()

{

1、输入

2、排序

3、查找

4、输出

}

元素唯一性问题:给出一个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。请设计出一个有效算法来解决这个问题,你的算法的时间复杂性是多少?

2. 测试数据

输入:

9 71 25 64 38 52 5 31 19 45

26 35 17 92 53 24 6 57 21 12 34 2 17 86 75 33

15 87 32 7 84 35 26 45 78 96 52 22 37 65 9 43 21 3 33 91

输出:No

Yes

No

3. 设计与实现的提示

算法最坏情况和平均情况的时间复杂性是衡量算法优劣的重要指标,算法设计要求尽可能设计比较高效的算法。

(二) 整数集合分解(选做)

1.问题描述

设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。

2. 测试数据

输入:

68 25 34 16 2 37 3 95 76 57 21 13 4 78 29 6 17 39 51 20 43 12

实验报告

实验报告

合肥师范学院实验报告册

2016/ 2017 学年第 1 学期

系别计算机学院

实验课程算法设计与分析

专业软件工程

班级一班

姓名杨文皇

学号1310421071

指导教师程敏

实验一:分治算法

一、实验目的

1、理解分治策略的基本思想;

2、掌握用分治法解决问题的一般技巧。

二、实验内容

利用分治算法在含有n个不同元素的数组a[n]中同时找出它的最大的两个元素和最小的两个元素,编写出完整的算法,并分析算法的时间复杂度。

三、实验源程序。

1、算法设计思想

利用分治法思想,n个不同元素的数组不断进行划分,化为若干个个子问题,其与原问题形式相;解决子问题规模较小而容易解决则直接解决:即当n的规模为只有一个或两个,三个或四个;否则再继续直至更小的子问题:即当n的规模大于四时。将已求得的各个子问题的解,逐步合并原问题的解:即将左右两边求得的子问题进行比较,在四个数据中的得到两个最大(最小)值。为了简化空间,采用了对每一个小规模问题的排序,以及合并原问题时,对四个数据进行排序,获得当前或合并的最大(最小)值

2、算法实现

#include

using namespace std;

int a[10]={4,5,6,2,3,9,8,13,1};

int b[4];

int sort(int i,int j)

{

int temp,k;

for(;i

{

for(k=i;k

if(a[k]>a[k+1])

{

temp=a[k];

a[k]=a[k+1];

a[k+1]=temp;

}

}

return 0;

}

int sort1(int lmin1,int lmin2,int rmin1,int rmin2)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深圳大学实验报告

课程名称:算法设计与分析

实验项目名称:排序算法性能分析

学院:

专业、班级:

指导教师:杨烜

报告人:学号:

实验报告提交时间: 2015.4.3

教务处制

一、实验目的与实验环境

实验目的:

1. 掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理

2. 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。

实验环境:VC++ 6.0

二、实验原理与算法描述

算法(1)选择排序 SelectSort(A[0...n-1],n)

//利用选择排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

for i<-0 to n-2 do

min<-i

for j<-i+1 to n-1 do

if A[j]

min<-j

swap A[i] and A[min]

理论效率:C(n) ∈θ(n^2),不稳定算法

算法(2)快速排序 QuickSort(A[0...n-1],n)

//利用快速排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

if l

s<-Partition(A[l...r]) //s是分裂位置

Quicksort(A[l...s-1])

Quicksort(A[s+1...r])

Partition(A[l...r])

//以第一个数为中轴,对子数组进行分区

//输入:数组A[0...n-1]中的子数组A[l...r],由左右下标l和r定义 //输出:数组A[l...r]的一个分区,分裂点的未知作为函数的返回值p<-A[l]

i<-l;j<-r+1

repeat

repeat i<-i+1 until A[i]>=P

repeat j<-j-1 until A[j]<=P

swap(A[i],A[j])

until i>=j

swap (A[i],A[j]) //当i>=j撤销最后一次交换

swap (A[l],A[j])

return j

理论效率:C(n) ∈θ(nlnn),不稳定算法

算法(3)合并排序 MergeSort(A[0...n-1])

//利用合并排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

if n>1

copy A[0...⌊n/2⌋-1] to B[0...⌊n/2⌋-1]

copy A[⌊n/2⌋...n-1] to C[0...⌈n/2⌉-1]

Mergesort(B[0...⌊n/2⌋-1])

Mergesort(C[0...⌈n/2⌉-1])

Merge(B,C,A)

Merge(B[0...p-1],C[0...q-1],A[0...p+q-1]) //将两个有序数组合并为一个有序数组

//输入:两个有序数组B[0...p-1],C[0...q-1]

//输出:A[0...p+q-1]中已经有序存放了B和C中的元素

i<-0;j<-0;k<-0

while i

if B[i]<=C[j]

A[k]<-B[i];i<-i+1

else

A[k]<-C[j];j<-j+1

k<-k+1

if i=p

copy C[j...q-1] to A[k...p+q-1]

else

copy B[i...p-1] to A[k...p+q-1] 理论效率:C(n)∈θ(nlogn),稳定算法

算法(4)冒泡排序 BubbleSort(A[0...n-1]) //利用冒泡排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

for i<-0 to n-2 do

for j<-0 to n-2-i do

if A[j+1]

swap A[j] and A[j+1]

理论效率:C(n)∈θ(n^2),稳定算法

算法(5)插入排序 InsertSort(A[0...n-1],n) //利用插入排序对给定的数组排序

//输入:一个可排序数组A[0...n-1]

//输出:非降序排列的数组A[0...n-1]

for k<-2 to n do

A[0]<-A[k]

j<-k-1

while (j!=0 and A[j]>A[0]) do

A[j+1]<-A[j]

j<-j-1

A[j+1]<-A[0]

理论效率:C(n)∈θ(n^2),稳定算法

三、实验代码与运行截图

实验关键代码:

1.选择排序

2.快速排序

3.合并排序

4.冒泡排序

5.插入排序

四、实验数据整理与分析

表一选择排序输入规模n与运行时间统计图

n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0020 0.1795 17.8550

表二快速排序输入规模n与运行时间统计图

n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0010 0.0020 0.0435

表三合并排序输入规模n与运行时间统计图

n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0005 0.0025 0.0260

表四冒泡排序输入规模n与运行时间统计图

n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0025 0.3550 39.8810

表五插入排序输入规模n与运行时间统计图

n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0005 0.0900 8.9120

图1. 选择排序时间效率与输入规模n的关系图

相关文档
最新文档