冒泡排序、选择排序、堆排序算法课程设计

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

《算法设计与分析导论》

课程设计

题目:排序

院系: 000000000000000000

专业: 00000000000000

学号姓名: 0000000000 000000 指导老师: 0000 日期: 2017 年 6 月 20 日

摘要

排序是计算机程序设计的一种重要操作,它的功能是将一组任意顺序的数据元素,根据一个或几个关键字按照一定的顺序重新排列成为有序的序列。.如何进行排序,特别是高效地处理进行排序是计算机应用中的主要课题之一。

由于待排序的记录数量不同,使得排序过程中能涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序的记录存放在计算机随机存储器中进行的排序过程;另一类是外部排序,指的是待排序的记录数量很大,以致内存不能一次容纳全部记录,在排序过程中尚需要对外存进行访问的排序过程。

本次课程设计就是研究内部排序中的三个常用的排序方法:直接插入排序、冒泡排序、堆排序。分析排序的实质,排序的应用。应用Java语言采用数组存储结构实现了三个排序算法,利用面向对象编程实现了本排序的综合系统。

关键词:排序,数据处理,时间复杂度

目录

引言 (1)

1 需求分析 (2)

1.1 任务 (2)

1.2 功能模块的划分 (2)

1.2.1 选择排序方法模块 (2)

1.2.2 输入模块 (2)

1.1.3 输出模块 (2)

1.3 排序模块分析 (2)

1.3.1 直接插入排序 (2)

1.3.2 冒泡排序 (2)

1.3.3 堆排序 (3)

2 概要设计 (4)

2.1 程序结构图 (4)

2.2 程序结构图 (5)

3 详细设计 (6)

3.1 开发平台及工具 (6)

3.2 核心算法设计 (6)

3.2.1 直接插入排序 (6)

3.2.2 冒泡排序 (7)

3.2.3 堆排序 (8)

3.3窗口设计 (9)

4 设计结果及分析 (10)

4.1 样例展示 (10)

4.2 数据记录分析 (12)

5 结论 (13)

谢辞 (14)

参考文献 (15)

附录 (16)

引言

由于排序运算在计算机应用中所处的重要地位,熟悉内部排序法的排序过程和各种算法的时间复杂度分析结果及其分析方法,以便在实际应用中,根据实际问题要求,选用合适的排序方法。

本次课程设计目的是通过程序语言设计并实现三种排序算法,直接插入排序、冒泡排序、堆排序的综合系统。通过对不同的数据计量进行实际排序对结构进行分析,找出它们之间的优势和劣势,并结合理论总结在实际运用排序算法过程中需要注意的问题。

1 需求分析

1.1 任务

输入N个乱序的数字,对这些数据分别采用直接插入排序、冒泡排序、堆排序进行排序,输出排序后的数据、数据的个数和排序所花费的时间。分析在相同数据下,采用不同算法所耗时间的差别。

1.2 功能模块的划分

1.2.1 选择排序方法模块

通过点击界面的单选按钮来选择何种算法进行排序,包括的算法有:直接插入排序、冒泡排序、堆排序。

1.2.2 输入模块

在文本框上输入需要排序的数据,数据可以使整型,也可是浮点型。数据之间用空格分开。

1.1.3 输出模块

在输出文本框上输出排序后的数据、数据的个数N还有排序数据所耗的时间。

1.3 排序模块分析

1.3.1 直接插入排序

插入排序重复地将一个新的元素插入到一个拍好序的子线性表中,直到整个线性表排好序。1.3.2 冒泡排序

冒泡排序算法多次遍历数组,在每次遍历中连续比较相邻的元素,如果元素没有按顺序排列,则换它们的值。

1.3.3 堆排序

把n个记录存与向量r之中,把它看成是完全二叉树,此时关键字序列不一定满足堆的关系。堆排序大体分为两步来处理。

初建堆,从堆的定义出发,当i=1、2、······、[2/n]时应该满足ki,<=k2i+1。所以先取i=[n/2](它一定是第n个节点的双亲编号),将以i结点为根的子书调整为堆,然后令i=i-1。此时可能会反复调整某些结点,知道i=1为止,堆初步建成。

堆排序,首先输出堆顶的元素(一般是最小值),让堆中最后一个元素上移到原堆顶位置,然后恢复堆。因为经过第一步输出堆顶元素的操作后,往往破坏了堆关系,所以要恢复堆;重复执行输出堆顶元素、堆尾元素上移和恢复的步骤。

2 概要设计

2.1 程序结构图

图3.1程序结构图

排序综合系统

生成窗口类

直接插入排序类

堆排序类

冒泡排序类

退出

2.2 程序结构图

开始

生成界面

选择算法,输入

数据

输出数据 直接插入排序类

堆排序类

冒泡排序类

退出

结束

图3.2 程序流程图

3 详细设计

3.1 开发平台及工具

本次课程设计开发的平台是Windows7。使用的程序开发语言是Java,编程环境是JDK8,使用的程序开发软件是eclipse。

3.2 核心算法设计

3.2.1 直接插入排序

假设待排序的记录存放在数组R[n]中,排序过程的某一中间时刻,R被划分为两个子区间[R[1],R[i-1]]和[R[i],R[n-1]],其中:前一个子区间是已经排好序的有序区;后一个子区间则是当前未排序的部分,不妨称其未无序区.直接插入排序的基本操作是将当前无序区的第一个记录R[i]插入到有序区中适当位置,使得R[1]到R[i]变为新的有序区.

初始时,令i=1,因为一个记录自然是有序的,故R[1]自成为一个有序区,无序区则是R[2]到R[n-1],然后依次将R[2],R[3],…,插入到当前的有序区中,直至i=n-1时,将R[n-1]插入到有序区为止.

现在的问题是:如何将一个记录R[i](i=2,3,…,n-1)插入到当前的有序区,使得插入后仍保证该区间记录是按关键字有序的.显然,最简单的方法是:首先,在当前有序区R[1]到R[i-1]中查找R[i]的正确插入位置k(1<=k<=i-1),然后,将R[k]到R[i-1]中记录均后移一个位置,腾出k位置上的空间插入R[i].当然,若R[i]的关键字大于R[1]到R[i-1]中所有记录的关键字,则R[i]就是插入原位置.但是,更为有效的方法是使查找比较操作和记录移动操作交替地进行,具体做法是将待插入记录R[i]的关键字依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较,若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;若R[j]的关键字小或等于于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置.因为关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可.

程序清单:

public static double[] insertionSor(double[] list){

相关文档
最新文档