数据结构课程设计-排序

合集下载

数据结构课程设计

数据结构课程设计

目录1问题描述 (2)2基本要求 (2)2.1问题分析及解决法案框架确定 (2)2.2程序设计 (2)2.3详细设计和编码 (2)3算法思想 (2)4模块划分 (3)4.1对各个模块进行功能的描述 (3)4.2模块之间关系及其相互调用 (3)5数据结构 (5)5.1定义栈 (5)5.2定义队列 (5)5.3栈的基本操作 (5)5.4队列的基本操作 (6)6测试数据 (6)7测试情况 (6)8总结 (9)1 问题描述试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。

其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

栈和队列是一种常见的数据结构,是两种非常重要的线性结构,也都是线性表,它们是操作受限的的线性表,有顺序栈、链式栈、链式队列和循环队列等形式。

它们广泛应用在各种软件系统中。

本题就是要用这些线性结构先完成基本的应用,如回文,逆置。

2 基本要求2.1问题分析及解决法案框架确定充分地分析和理解问题本身,使程序结构清晰合理简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。

2.2程序设计1、选择顺序栈和链队列,完成回文判断、字符串的逆置;2、选择链栈和循环队列,完成回文判断、字符串的逆置;3、运用掌握C语言编写程序,实现所编程序的各个模块功能。

2.3详细设计和编码给出所有源程序清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。

3 算法思想运用栈和队列算法,在序列依次输入时将序列分别入栈和入队列,利用栈FILO 和队列FIFO的特点,通过出栈和出队列实现序列顺序和逆序的比较,根据题目描述的回文序列判断并输出结果。

定义顺序栈和链队列及关于它们的基本操作,如定义栈和队列、求栈和队列的长度、入栈出栈、入队列出队列等。

南师大数据结构课程设计报告

南师大数据结构课程设计报告

数据结构课程设计报告学号:888888姓名:草丛伦学院:超神学院专业:LOL指导老师:流老师2050年9月一.要求1.必做题:编程实现希尔,快速,堆排序,归并排序算法,要求随机产生10000个数据存入磁盘文件,然后读入数据文件,分别采用不同的排序方法进行排序,并将结果存入文件中。

2.选做题:链表的维护与文件形式的保存:用链表结构的有序表表示某商场家电部的库存模型。

当有提货或进货时需要对该链表及时进行维护。

每个工作日结束之后,将该链表中的数据以文件形式保存,每日开始营业之前,需将以文件形式保存的数据恢复成链表结构的有序表。

链表结点数据域包括家电名称,品牌,单价和数量,以单价的升序体现链表的有序性。

程序功能包括:创建表,营业开始(读入文件恢复链表),进货(插入),提货(更新或删除),查询信息,更新信息,营业结束(链表数据存入文件)等。

二.算法思想描述1.排序算法的实现通过不同的算法,来对一大串随机数字进行有序的排列,是复杂的。

我主要用了在排序算法中效率比较高的几种算法,其分别是:希尔,快速,堆排序,归并排序。

通过这几种算法对由电脑随机产生的10000个数字进行由小到大的排序,并将结果存入文件中。

我的设计思想就是基于C++的面向对象,就是每一种算法对应于一个类,所以程序分别产生了4个类,来解决排序问题。

每个类中都有自己的构造函数和析构函数,还有就是自己的排序算法函数。

每个类还必须包含一个文件处理函数,因为我们的操作都是针对于文件的。

对于文件的处理,我用的是c中的格式化读写函数-----fprintf()和fscanf()。

最后就是讲结果保存在一个txt文件中(结果在排序目录下的文件中)。

2.链表的维护构建一个菜单循环,然后每个功能的实现通过其对应函数去实现,函数头调用系统中的相关函数,以确保程序运行正常。

建立一个商场的家电库存模型,有相关函数及指针等,输入信息,输出信息,查询修改删除的条件函数,用menu实现主菜单选择操作,实现一系列操作,释放所有链表,读取内存,自动创建文件夹。

数据结构课程设计计划

数据结构课程设计计划

信息工程学院14级计科、软件工程专业数据结构课程设计计划设计名称《数据结构》课程设计专业、班级计科1401-1403,软件1401-1402 课程性质必修设计周数1周课程学期学时数64学时学期学分4分指导教师签字系主任审核签字一.课程设计的目的通过课程设计的综合训练,旨在帮助学生进一步系统的掌握数据结构这门课的主要内容,并进一步培养学生分析问题和解决问题的能力,主要体现在能够让学生针对实际问题有效地组织数据,选择合适的数据结构,并进行正确和高效的算法设计,并用程序实现算法。

该课的课程设计是一个良好的程序设计技能训练的过程使学生能够:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工程专业学生所应具备的科学的工作方法和作风。

二.课程设计安排三.课程设计内容1.设计题目题目1:运动会分数统计【问题描述】参加运动会有n个学校,学校编号为1……n。

比赛分成m个男子项目,和w个女子项目。

项目编号为男子1……m,女子m+1……m+w。

不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。

(m<=20,n<=20)。

【基本要求】(1) 可以输入各个项目的前三名或前五名的成绩;(2) 能统计各学校总分;(3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;(4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校;(5) 学生自己根据系统功能要求自己设计存储结构,但是要求运动会的相关数据要存储在数据文件中并能随时查询;(6) 输入数据形式和范围:可以输入学校的名称,运动项目的名称;(7) 使用汉字显示。

数据结构课程设计python

数据结构课程设计python

数据结构课程设计python一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用数据结构如列表、元组、字典和集合的特点及应用场景。

2. 学习并掌握栈和队列的操作原理及其在Python中的实现方法。

3. 掌握树和图的基本概念,了解二叉树、遍历算法及图的表示方法。

技能目标:1. 能够运用Python语言实现基本数据结构,并对其进行增、删、改、查等操作。

2. 能够利用栈和队列解决实际问题,如递归、函数调用栈、任务调度等。

3. 能够运用树和图解决实际问题,如查找算法、路径规划等。

情感态度价值观目标:1. 培养学生严谨的逻辑思维,提高分析问题和解决问题的能力。

2. 激发学生对数据结构和算法的兴趣,培养良好的编程习惯。

3. 引导学生认识到数据结构在实际应用中的重要性,增强学习热情和责任感。

课程性质:本课程为高年级数据结构课程,旨在使学生掌握Python语言实现数据结构的方法,提高编程能力和解决问题的能力。

学生特点:学生具备一定的Python编程基础,具有较强的逻辑思维能力,对数据结构有一定的了解。

教学要求:结合实际案例,采用任务驱动法,引导学生通过实践掌握数据结构的基本原理和应用方法。

注重培养学生的动手能力和团队协作精神,提高学生的综合素质。

通过本课程的学习,使学生能够具备独立设计和实现小型项目的能力。

二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,结合Python语言特点,分析各类数据结构在实际应用中的优势。

- 列表、元组、字典和集合的原理与应用- 栈与队列的操作原理及实现2. 线性表:讲解线性表的概念,重点掌握顺序表和链表的操作方法。

- 顺序表和链表的实现及操作- 线性表的查找和排序算法3. 树与二叉树:介绍树的基本概念,重点讲解二叉树的结构及其遍历算法。

- 树的基本概念和表示方法- 二叉树的性质、存储结构、遍历方法4. 图:讲解图的基本概念,掌握图的存储结构及遍历方法。

- 图的基本概念和表示方法- 图的遍历算法(深度优先搜索、广度优先搜索)- 最短路径和最小生成树算法5. 算法分析与设计:结合实例,分析算法性能,掌握基本的算法设计方法。

数据结构课程设计

数据结构课程设计

《数据结构》课程设计实践指导书一、实践的目的和任务《数据结构》课程设计是计算机科学技术专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。

开设本课程设计实践的主要目的就是要达到理论与实际应用相结合,提高学生的动手能力,完成计算机应用能力的培养;主要任务是通过对给定问题的求解,使学生在运用《数据结构》、程序设计以及其它所学课程中的各种基本技术和理论,在建立问题模型、构造求解算法、设计数据结构、编程及上机调试等方面得到全面的锻炼,从而能更深刻地理解《数据结构》的精髓,为后续软件课程的学习及软件设计能力的提高奠定良好的基础。

二、实践的内容和要求(一)实践内容实践内容为数据结构课程完成后,运用《数据结构》、程序设计以及其它所学课程中的知识和技术来解决实际的问题。

在解决实际应用性问题时,按照计算机解决问题的步骤进行以下几个方面的工作:采用简明、严格的问题描述,建立模型,设计求解方法,用计算机实现求解方法,最后进行测试和文档制作。

1、建立模型许多问题的最初描述既不精确又不简练,还有一些问题不可能简单而精确地用计算机可求解的形式来描述,即使有些可用计算机求解的问题,也需要在很大范围内确定问题的参数,而那些合理的参数值只有通过实验才能确定。

因此,要用计算机解决问题,必须首先要以简明、严格的方式将问题描述清楚。

数学或其它科学中的几乎所有分支都可作为某一类具体问题的抽象模型。

例如,在涉及到若干对象及其相互间关系的问题时所用的数学模型为图论;数值计算问题中常用的数学模型为线性方程组(用于求解电路的电流强度或结构中的应力)或微分方程(用于预报人口增长情况或化学反应速度等);在符号与文本处理问题时常用字符串及形式语法作为模型(如编译系统)。

《数据结构》课程中所介绍的各种结构均可作为一种模型。

2、构造算法对问题建立了适当的数学模型后,就可以依据这一模型求解。

最初的目标是给出一个算法形式的解法,这是设计的核心部分。

运动会分数统计(数据结构课程设计)

运动会分数统计(数据结构课程设计)

运动会分数统计(数据结构课程设计)
在现代社会,竞技运动会已经成为一项重要的社会活动,对学生和参
赛者都有重要的意义。

计算机技术在现代社会中有重要的作用,特别
是数据结构理论,它能够有效地提高竞赛的效率和准确性,从而更好
地服务于社会的发展。

最近,我参加了一次数据结构课程的设计,以
实现一种竞技运动会的分数统计功能。

计算机科学中的数据结构和算法理论,可以用来存储、排序、检索等
是必不可少的。

这项课程设计,主要是利用链表和堆栈的数据结构来
存储竞赛数据,并利用递归算法来进行排序,以便快速检索想要的结果。

我分解了该项设计过程,先根据运动项目分层链表,以存储每个
运动项目及其分数;然后根据不同项目要求,采用递归或非递归算法
来排序;最后,利用堆栈的数据结构,将得分按从高到低的形式输出。

在本项目完成后,可以更加有效地实现竞技运动会的分数统计,提高
评审效率和结果准确性。

通过运用数据结构和算法理论,使我更加深
入地了解了计算机科学和编程领域的应用,让我拥有了更多的实用技能,在未来的工作中发挥着强有力的作用。

《数据结构》课程标准

《数据结构》课程标准

《数据结构》课程标准课程名称:数据结构课程代码:3250619适用专业:软件技术专业(软件开发方向)课程性质:专业必修课学时:48学时(理论:24 实践: 24)学分:3学分一、课程概述(一)课程的地位和作用《数据结构》是软件技术专业(软件开发方向)的一门专业必修课。

课程的前导课程是《Java面向对象编程》,本课程在后续软件开发类课程中起着非常重要的作用,其知识的应用将贯穿于本专业的所有课程。

在程序设计中,一个好的程序无非是选择一个合适的数据结构和好的算法,而好的算法的选择很大程度上取决于描述实际问题的数据结构的选取。

所以,学好数据结构,将是进一步提高学生程序设计水平的关键之一。

数据结构的应用水平是区分软件开发、设计人员水平高低的重要标志之一,缺乏数据结构和算法的深厚功底,很难设计出高水平的具有专业水准的应用程序。

本课程的改革理念是,坚持工程化、实用化教学,密切适应计算机技术的发展趋势,坚持学以致用;解决抽象理论与实践相脱节现象,让绝大多数学生在有限的时间内迅速掌握课程的基本理论知识,并把理论知识应用到软件开发的实际工作中,开发出高质是的应用软件。

(二)课程设计思路课程资源建设遵循三个原则、一个过程、四个应用层次。

课程内容的选取遵循科学性原则,课程内容的选取依据数据结构课程在学科体系的理论体系,结合其在实际开发中的使用频度及难易程度,选取适合高职学生的学习内容;课程内容的组织遵循情境性原则,所有模块的内容按一个过程进行组织。

课程内容置于由实践情境建构的以软件开发过程主要逻辑为主线的行动体系之中,采用打碎、集成的思想,将学科体系中所涉及的概念、方法、原理打碎,然后按照软件开发过程逻辑重新集成。

课程资源的建设充分体现人本性原则,按人类掌握知识的基本规律“获取—>内化—>实践—>反思—>新的获取”,开发四个实践层次“验证性应用、训练性应用、设计性应用、创造性应用”的训练题库。

二、培养目标(一)总体目标《数据结构》课程以培养学生的数据抽像能力和复杂程序设计的能力为总目标。

数据结构课程设计

数据结构课程设计

数据结构课程设计----个人设计报告专业:班级:姓名:学号:指导教师:日期: 2016年X月XX日至XX日目录1 课程设计目的 (3)2 课程设计内容和要求 (3)3 任务完成情况 (3)4 设计报告 (4)4.1顺序表应用 (4)4.1.1 设计目的 (4)4.1.2 设计内容及要求 (4)4.1.3 需求分析 (5)4.1.4 概要设计 (7)4.1.5 详细代码 (8)4.1.6 使用说明 (8)4.1.7 测试结果与分析 (8)4.1.8 参考文献 (10)4.2链表应用 (10)4.2.1 设计目的 (10)4.2.2 设计内容及要求 (11)4.2.3 需求分析 (12)4.2.4 概要设计 (14)4.2.5 详细代码 (16)4.2.6 使用说明 (16)4.2.7 测试结果与分析 (16)4.2.8 参考文献 (18)4.3树和二叉树 (19)4.3.1 设计目的 (19)4.3.2 设计内容及要求 (19)4.3.3 需求分析 (19)4.3.4 概要设计 (20)4.3.5 详细代码 (21)4.3.6 使用说明 (21)4.3.7 测试结果与分析 (22)4.3.8 参考文献 (22)5 体会与感想 (23)附录: (24)设计一(顺序表应用)的代码 (24)设计二(链表的应用)的代码 (35)设计三(二叉树应用)的代码 (47)1 课程设计目的1、学习获取知识的方法;2、提高发现问题、分析问题和解决实际问题的能力;3、加强创新意识和创新精神;4、加强团队的分工与合作;5、掌握面向实际背景思考问题的方法。

2 课程设计内容和要求内容:(仅供参考,请根据实际完成情况填写)第一章前言第二章顺序表与链表的应用第三章树结构的应用第四章图结构的应用第五章赫夫曼编码的应用要求:完成第2章、第3章中每章的比作必做任务。

在完成个人任务的基础上,完成第4章第5章的小组任务。

每人必须在完成个人任务的基础上提交个人任务的设计报告,内容包括:任务名称、目的、具体内容、需求分析、概要设计、主要代码分析、测试结果、收获与体会。

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

一、问题描述1、排序问题描述排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。

简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。

本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。

我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。

其中包括:(1)插入排序的有关算法:不带监视哨的直接插入排序的实现;(2)交换排序有关算法:冒泡排序、快速排序的实现;(3)选择排序的有关算法:直接选择排序、堆排序的实现;(4)归并排序的有关算法:2-路归并排序的实现。

2、界面设计模块问题描述设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。

界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。

二、问题分析本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。

应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。

冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。

冒泡排序的步骤:1)置初值i=1;2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j]与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置;3)i=i+1;4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止;要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。

快速排序的基本思想是:通过一趟排序将要排序的记录分割成独立的两个部分,其中一部分的所有记录的关键字值都比另外一部分的所有记录关键字值小,然后再按此方法对这两部分记录分别进行快速排序,整个排序过程可以递归进行,以此达到整个记录序列变成有序。

快速排序步骤:1)设置两个变量i、j,初值分别为low和high,分别表示待排序序列的起始下标和终止下标。

2)将第i个记录暂存在变量pivot中,即pivot=r[i];3)从下标为j的位置开始由后向前依次搜索,当找到第一个比pivot的关键字值小的纪录时,则将该记录向前移动到下标为i的位置上,然后i=i+1;4)从下表为i的位置开始由前向后依次搜索,当找到第一个比pivot的关键字值大的记录时,则将该记录向后移动到下标为j的位置上;然后j=j-1;5)重复步骤3)和4),直到i= =j为止;6)r[i]=pivot.三、数据结构描述快速排序和冒泡排序都属于内部排序,快速排序是不稳定的排序,而冒泡排序是稳定的排序。

内部排序是指带排序序列完全存放在内存中进行的排序过程,这种方法适合数量不太大的数据元素的排序。

四、算法设计1.冒泡排序的程序流程图2.冒泡排序算法设计public void bubbleSort() {RecordNode temp; //辅助结点boolean flag = true; //是否交换的标记for (int i = 1; i < this.curlen && flag; i++) { //有交换时再进行下一趟,最多n-1趟flag = false; //假定元素未交换for (int j = 0; j < this.curlen - i; j++) { //一次比较、交换cm[1].setCpn(cm[1].getCpn()+1); //比较次数加1if (r[j].getKey().compareTo(r[j + 1].getKey()) > 0) { //逆序时,交换temp = r[j];r[j] = r[j + 1];r[j + 1] = temp;cm[1].setMvn(cm[1].getMvn()+3); //移动次数加3;flag = true;}}}}3.快速排序的程序流程图(1)4.快速排序的程序流程图(2)5.快速排序算法设计public int partition(int i,int j) {RecordNode pivot=r[i]; //第一个记录作为支点记录while(i<j){ //从表的两端交替地向中间扫描while(i<j&&pivot.getKey().compareTo(r[j].getKey())<=0){j--;}if(i<j){r[i]=r[j]; //将比支点记录关键字值小的记录向前移动i++;}while(i<j&&pivot.getKey().compareTo(r[i].getKey())>0){i++;}if(i<j){r[j]=r[i]; //将比支点记录关键字值大的记录向后移动j--;}}r[i]=pivot; //支点记录到位return i; //返回支点位置}public void qSort(int low,int high){if(low<high){int pivotloc=partition(low,high);qSort(low,pivotloc-1);qSort(pivotloc+1,high);}}public void quickSort(){qSort(0,this.curlen-1);}五、详细程序清单package KCSJ_Sort;import java.util.Scanner;//记录结点类class RecordNode {private Comparable key;private Object element;public Object getElement() {return element;}public void setElement(Object element) {this.element = element;}public Comparable getKey() {return key;}public void setKey(Comparable key) {this.key = key;}public RecordNode(Comparable key) {this.key = key;}public RecordNode(Comparable key, Object element) {this.key = key;this.element = element;}}//关键字类型类class KeyType implements Comparable<KeyType> {private int key;public KeyType() {}public KeyType(int key) {this.key = key;}public int getKey() {return key;}public void setKey(int key) {this.key = key;}public String toString() {return key +"";}public int compareTo(KeyType another) {int thisVal = this.key;int anotherVal = another.key;return (thisVal < anotherVal ? -1 : (thisV al == anotherVal ? 0 : 1));}}//比较与移动次数类class CopareMoveNum{private int cpn;private int mvn;public int getCpn() {return cpn;}public void setCpn(int cpn) {this.cpn = cpn;}public int getMvn() {return mvn;}public void setMvn(int mvn) {this.mvn = mvn;}}//顺序排序表类class SeqList {CopareMoveNum[] cm;private RecordNode[] r;private int curlen;public RecordNode[] getRecord() {return r;}public void setRecord(RecordNode[] r) {this.r = r;}public SeqList(int maxSize) {this.r = new RecordNode[maxSize];this.curlen = 0;this.cm=new CopareMoveNum[3];for(int i=0;i<3;i++){this.cm[i] = new CopareMoveNum();this.cm[i].setCpn(0);this.cm[i].setMvn(0);}}// 求顺序表中的数据元素个数并由函数返回其值public int length() {return curlen; //}public void insert(int i, RecordNode x) throws Exception { if (curlen == r.length) {throw new Exception("顺序表已满");}if (i < 0 || i > curlen) {throw new Exception("插入位置不合理");}for (int j = curlen; j > i; j--) {r[j] = r[j - 1];}r[i] = x;this.curlen++;}//输出数组元素public void display() {for (int i = 0; i < this.curlen; i++) {System.out.print(" " + r[i].getKey().toString());}System.out.println();}// 不带监视哨的直接插入排序算法public void insertSort() {RecordNode temp;int i, j;for (i = 1; i < this.curlen; i++) {temp = r[i];cm[0].setMvn(cm[0].getMvn()+1);for (j = i - 1; j >= 0 && temp.getKey().compareTo(r[j].getKey()) < 0; j--) {cm[0].setCpn(cm[0].getCpn()+1);r[j + 1] = r[j];cm[0].setMvn(cm[0].getMvn()+1);}r[j + 1] = temp;cm[0].setMvn(cm[0].getMvn()+1);}}// 冒泡排序算法public void bubbleSort() {RecordNode temp;boolean flag = true;for (int i = 1; i < this.curlen && flag; i++) {flag = false;for (int j = 0; j < this.curlen - i; j++) {cm[1].setCpn(cm[1].getCpn()+1);if (r[j].getKey().compareTo(r[j + 1].getKey()) > 0) {temp = r[j];r[j] = r[j + 1];r[j + 1] = temp;cm[1].setMvn(cm[1].getMvn()+3);flag = true;}}}}// 快速排序算法public int partition(int i,int j) {RecordNode pivot=r[i];while(i<j){while(i<j&&pivot.getKey().compareTo(r[j].getKey())<=0){j--;}if(i<j){r[i]=r[j];i++;}while(i<j&&pivot.getKey().compareTo(r[i].getKey())>0){ i++;}if(i<j){r[j]=r[i];j--;}}r[i]=pivot;return i;}public void qSort(int low,int high){if(low<high){int pivotloc=partition(low,high);qSort(low,pivotloc-1);qSort(pivotloc+1,high);}}public void quickSort(){qSort(0,this.curlen-1);}//简单选择排序算法public void selectSort() {RecordNode temp;for (int i = 0; i < this.curlen - 1; i++) {int min = i;for (int j = i + 1; j < this.curlen; j++) {cm[2].setCpn(cm[2].getCpn()+1);if (r[j].getKey().compareTo(r[min].getKey()) < 0) {min = j;}}if (min != i) {temp = r[i];r[i] = r[min];r[min] = temp;cm[2].setMvn(cm[2].getMvn()+3);}}}//堆排序算法public void sift(int low, int high){int i=low;int j=2*i+1;RecordNode temp=r[i];while(j<high){if(j<high-1&&r[j].getKey().compareTo(r[j+1].getKey())>0){ j++;}if(temp.getKey().compareTo(r[j].getKey())>0){r[i]=r[j];i=j;j=2*i+1;}else{j=high+1;}}r[i]=temp;}public void heapSort(){int n=this.curlen;RecordNode temp;for(int i=n/2-1;i>=0;i--){sift(i,n);}for(int i= n-1;i>0;i--){temp=r[0];r[0]=r[i];r[i]=temp;sift(0,i);}}//归并排序算法public void merge(RecordNode[] r,RecordNode[] order,int h,int m,int t){ int i=h,j=m+1,k=h;while(i<=m&&j<=t){if(r[i].getKey().compareTo(r[j].getKey())<=0){order[k++]=r[i++];}else{order[k++]=r[j++];}}while(i<=m){order[k++]=r[i++];}while(j<=t){order[k++]=r[j++];}}public void mergepass(RecordNode[] r,RecordNode[] order,int s,int n){ int p=0;while(p+2*s-1<=n-1){merge(r, order, p, p+s-1, p+2*s-1);p+=2*s;}if(p+s-1<n-1){merge(r, order, p, p+s-1, n-1);}else{for(int i=p;i<=n-1;i++){order[i]=r[i];}}}public void mergeSort(){int s=1;int n=this.curlen;RecordNode[] temp= new RecordNode[n];while(s<n){mergepass(r,temp,s,n);display();s*=2;mergepass(temp,r,s,n);display();s*=2;}}}//测试类public class KCSJ_Sort_1 {static SeqList ST = null;public static void createSearchList() throws Exception {ST=new SeqList(20);Scanner sc=new Scanner(System.in);System.out.print("请输入排序表的表长:");int n=sc.nextInt();KeyType[] k= new KeyType[n];System.out.print("请输入排序表中的关键字序列:");for (int i = 0; i < n; i++) { //输入关键字序列k[i] = new KeyType(sc.nextInt());}for(int i=0;i<n;i++){ //创建顺序排序表RecordNode r = new RecordNode(k[i]);ST.insert(i, r);}}public static void main(String[] args) throws Exception{Scanner sc=new Scanner(System.in);//System.out.println("创建顺序查找表");//createSearchList();while(true){System.out.println(" *************** 欢迎进入排序系统***************\n ");System.out.println(" ★ 1 直接插入排序 2.冒泡排序 3.快速排序★\n ");System.out.println(" ★ 4.直接选择排序 5 堆排序 6.归并排序★\n ");System.out.println (" ★0.退出★\n ");System.out.println("*********************************************** \n ");System.out.print("请输入选择(0-6):");int i=sc.nextInt();switch(i){case 1: System.out.println("---不带监视哨直接插入排序---");System.out.println("创建顺序排序表");createSearchList();ST.insertSort();System.out.print("排序结果:");ST.display();System.out.println("比较次数为:"+ST.cm[0].getCpn());System.out.println("移动次数为:"+ST.cm[0].getMvn());break;case 2: System.out.println("---冒泡排序---");System.out.println("创建顺序排序表");createSearchList();ST.bubbleSort();System.out.print("排序结果:");ST.display();System.out.println("比较次数为:"+ST.cm[1].getCpn());System.out.println("移动次数为:"+ST.cm[1].getMvn());break;case 3: System.out.println("---快速排序---");System.out.println("创建顺序排序表");createSearchList();ST. quickSort();System.out.print("排序结果:");ST.display();break;case 4: System.out.print("---简单选择排序---");System.out.println("创建顺序排序表");createSearchList();ST.selectSort();System.out.print("排序结果:");ST.display();System.out.println("比较次数为:"+ST.cm[2].getCpn());System.out.println("移动次数为:"+ST.cm[2].getMvn());break;case 5: System.out.print("---堆排序---");System.out.println("创建顺序排序表");createSearchList();ST. heapSort ();System.out.print("排序结果:");ST.display();break;case 6: System.out.print("---归并排序---");System.out.println("创建顺序排序表");createSearchList();ST. mergeSort ();System.out.print("排序结果:");ST.display();break;case 0:return;}}}}六、程序运行结果快速排序的运行结果:七、心得体会通过这次课程设计,使我彻底明白了理论不等于实践,在课本上本理解的很好的冒泡排序在总体运行的过程中也出现了诸多漏洞,同时暴露出我在数据结构的知识方面的欠缺,而在调试快速排序的时候也不是那么容易上手,因为在以前的实验中未涉及到快速排序的编程问题,我也只是在学习过程中粗略地知道快速排序的排序方法,并未深究。

相关文档
最新文档