内部排序算法实现与性能分析课程设计.

合集下载

内部排序课程设计报告

内部排序课程设计报告

内部排序课程设计报告一、教学目标本课程的教学目标是使学生掌握内部排序的基本概念、算法和应用。

通过本课程的学习,学生应能理解内部排序的原理,熟练运用各种排序算法解决实际问题,并培养逻辑思维和编程能力。

具体来说,知识目标包括:1.了解内部排序的基本概念,如排序、逆序、稳定性等。

2.掌握各种内部排序算法的原理和实现,如冒泡排序、选择排序、插入排序、快速排序、归并排序等。

3.理解内部排序在实际应用中的重要性,如数据库查询、文件整理等。

技能目标包括:1.能够运用内部排序算法解决实际问题,如对给定的数据集进行排序。

2.能够编写程序实现内部排序算法,提高编程能力。

3.能够对不同的内部排序算法进行比较和优化,提高算法效率。

情感态度价值观目标包括:1.培养学生的团队合作精神,通过小组讨论和合作完成排序任务。

2.培养学生的创新意识,鼓励学生提出新的排序算法和改进方案。

3.培养学生的综合素养,使学生认识到内部排序在现实生活中的应用和价值。

二、教学内容本课程的教学内容主要包括内部排序的基本概念、算法和应用。

具体的教学大纲如下:1.内部排序的基本概念:介绍排序的定义、逆序、稳定性等基本概念。

2.冒泡排序算法:讲解冒泡排序的原理和实现,并通过编程实践让学生掌握该算法。

3.选择排序算法:讲解选择排序的原理和实现,并通过编程实践让学生掌握该算法。

4.插入排序算法:讲解插入排序的原理和实现,并通过编程实践让学生掌握该算法。

5.快速排序算法:讲解快速排序的原理和实现,并通过编程实践让学生掌握该算法。

6.归并排序算法:讲解归并排序的原理和实现,并通过编程实践让学生掌握该算法。

7.内部排序的应用:介绍内部排序在实际应用中的重要性,如数据库查询、文件整理等。

三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法和实验法等。

1.讲授法:教师通过讲解内部排序的基本概念、算法和应用,使学生掌握相关知识。

内部排序算法比较课程设计报告(7种基本排序)

内部排序算法比较课程设计报告(7种基本排序)

合肥学院计算机科学与技术系1、问题分析和任务定义各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间,存在一定的却缺陷。

我们将通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。

所设计的程序应能够将产生的随机数据同时用不同的内部排序算法排序,并列出关键字比较次数与移动次数,方便比较。

待排序表的表长不少于100,为方便起见,我们令表长等于100,用5组随机的数据排序的结果作比较。

2、数据结构的选择和概要设计一.可能排序表的抽象数据类型定义:ADTOrderableList{数据对象:D={|∈IntegerSet,i=1,2,……,n,n≥0}数据关系:R1={<,|,∈D,i=2,……n}基本操作:InitList(n)操作结果:构造一个长度为n,元素值依次为1,2,……,n的有序表。

RandomizeList(d,isInverseOrder)操作结果:首先根据isInverseOrder为True或False,将表置为逆序或正序,然后将表进行d(0≤d≤8)级随机打乱。

d为0时表不打乱,d越大,打乱程度越高。

RecallList()操作结果:恢复最后一次用RandomizeList随机大乱的可排序表。

ListLength()操作结果:返回可排序的长度。

ListEmpty()操作结果:若可排序表为空表,则返回True,否则返回False。

BubbleSort(&c,&s)操作结果:进行冒泡排序,返回关键字比较次数c和移动次数s。

InsertSort(&c,&s)操作结果:进行插入排序,返回关键字比较次数c和移动次数s。

SelectSort(&c,&s)操作结果:进行选择排序,返回关键字比较次数c和移动次数s。

QuickSort(&c,&s)操作结果:进行快速排序,返回关键字比较次数c和移动次数s。

数据结构课程设计(内部排序算法性能分析)

数据结构课程设计(内部排序算法性能分析)

“数据结构”课程设计报告(内部排序算法性能分析)学生姓名:指导教师:所在系:所学专业:年级:目录1、需求分析..................................................... - 1 -1.1、选题要求 (1)1.2、选题的意义及背景 (1)1.3、课程设计目标 (1)2、概要设计..................................................... - 2 -2.1、原始数据 (2)2.2、输出数据 (2)2.3、数据处理 (2)2.4、逻辑结构及物理结构 (3)2.5、系统的模块划分及模块功能 (3)2.5.1主程序模块....................................................................................................... - 3 -2.5.2可排序表单元模块........................................................................................... - 3 -2.6、模块的测试数据 (4)3、详细分析..................................................... - 5 -4、调试分析..................................................... - 6 -5、用户手册..................................................... - 9 -6、测试结果.................................................... - 10 -6.1测试用例及选择原因 (10)6.2测试结果 (10)7、总结........................................................ - 12 -8、参考文献.................................................... - 13 -9、小组人员分工................................................ - 13 -致谢......................................................... - 13 -1、需求分析1.1、选题要求对各种排序算法进行定量的性能分析。

课设—内部堆排序算法实现

课设—内部堆排序算法实现

数据结构课程设计设计说明书内部排序堆排序算法的实现学生姓名李超凡学号1118014123班级计本1104班成绩指导教师林勇数学与计算机科学学院2013年9月9日课程设计任务书2013—2014学年第一学期课程设计名称:数据结构课程设计课程设计题目:内部堆排序算法的实现完成期限:自2013年9月9日至2013年9月21 日共2 周设计内容:1.任务说明堆排序是数据结构中内排序部分的重点知识。

堆分为大顶堆和小顶堆。

堆排序的过程主要解决两个问题:(1)把无序序列建成一个堆;(2)输出堆顶元素后,重新将剩余元素调整成新堆。

本课程设计主要完成的核心内容即为此。

按以下的要求运用C/ C++结构体、指针、数据结构等基知识编程实现。

2.要求1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。

4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。

5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。

6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。

算法的时间、空间复杂性分析;7)编写课程设计报告;3.参考资料指导教师:林勇教研室负责人:曹阳课程设计评阅摘要为了查找方便,通常希望通过排序使表成为按关键字有序排列。

本设计利用简单排序的堆排序方法,通过建立大根堆,并对排好序的元素进行输出,实现用户输入的一组可以组成堆的数据元素进行处理,使其按关键字排成一个有序的序列,从而有效的提高了查找效率。

再加上界面友好、操作简单,使其更加好用。

关键词:堆排序;大顶堆;查找`目录1 课题描述 (1)2 问题分析及任务定义 (2)3 逻辑设计 (3)3.1整体设计 (3)3.2抽象数据类型 (3)(1)首先是存储结构: (4)(2)抽象数据类型 (4)3.3各个模块之间的关系 (4)4 详细设计 (6)4.1首先是整体的主要设计思想 (6)4.2 程序流程图及实现代码 (6)4.2.1 输入数据并存储到内存中 (6)4.2.2 堆排序函数(含建立大根堆) (6)4.4菜单函数 (9)4.5 主函数 (9)5 程序编码 (11)6 程序调试及测试 (15)6.1 第一组 (15)6.2第二组 (16)7 结果分析 (18)8 总结 (19)参考文献 (20)1 课题描述本次课题的内容就是应用堆排序实现关键字有序的算法。

内排序课程设计

内排序课程设计

内排序课程设计一、课程目标知识目标:1. 学生能理解内排序的基本概念,掌握不同内排序算法的特点及适用场景。

2. 学生能描述冒泡排序、选择排序、插入排序等常见内排序算法的步骤及原理。

3. 学生了解内排序算法的时间复杂度和空间复杂度,能分析其优缺点。

技能目标:1. 学生能运用编程语言实现冒泡排序、选择排序、插入排序等内排序算法。

2. 学生具备分析实际问题并选择合适内排序算法解决的能力。

3. 学生能通过调试和优化内排序算法,提高程序性能。

情感态度价值观目标:1. 学生培养对算法学习的兴趣,增强解决问题的自信心。

2. 学生养成合作、探究的学习习惯,培养团队精神和创新意识。

3. 学生认识到算法在计算机科学中的重要性,理解科技发展对社会进步的推动作用。

课程性质:本课程为计算机科学课程,以算法学习为主,强调理论与实践相结合。

学生特点:六年级学生具备一定的逻辑思维能力,对计算机编程有初步了解,但对复杂算法的认识有限。

教学要求:结合学生特点,采用案例教学、任务驱动等方法,引导学生主动探究,注重培养学生的实际操作能力和问题解决能力。

在教学过程中,关注学生的情感态度,激发学习兴趣,提高学生的综合素质。

通过本课程的学习,使学生在知识、技能和情感态度价值观方面均取得具体的学习成果。

二、教学内容1. 内排序概念:介绍内排序的定义、分类及在计算机科学中的应用。

- 冒泡排序- 选择排序- 插入排序2. 常见内排序算法:- 冒泡排序:讲解算法原理、步骤,分析时间复杂度和空间复杂度。

- 选择排序:介绍算法原理、步骤,分析优缺点及适用场景。

- 插入排序:阐述算法原理、步骤,分析时间复杂度和空间复杂度。

3. 内排序算法分析:- 时间复杂度:讲解如何计算内排序算法的时间复杂度,比较不同算法的时间性能。

- 空间复杂度:分析内排序算法的空间复杂度,探讨如何优化算法空间性能。

4. 编程实践:- 冒泡排序、选择排序、插入排序的实现。

- 算法性能比较与优化。

内部排序算法性能分析之数据结构课程设计

内部排序算法性能分析之数据结构课程设计

课程名称:数据结构本科学生课程设计(论文)题目内部排序算法性能分析姓名阳明学号104328318117680学部计算机科学与技术专业、年级计科1003指导教师刘琼2011年12月24日湖南涉外经济学院本科课程设计(论文)摘要排序是计算机科学中基本的研究课题之一,其目的是方便记录的查找、插入和删除.通过描述冒泡、选择、插入、堆和快速6种排序算法,内部排序其算法灵活方便,因此成为了程序算法中一个必不可少的应用,所以在应用之前要经过严谨的思考才不会出错,不会造成计算机运算速度的延迟,才会完全发挥内部排序的性能。

内部排序的方法种类繁多,但就其全面性能而言,很难提出一种被认为是最好的方法。

但就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合不同的环境(如记录的初始排序列状态等)下使用。

如果安排序过程中依据的不同原则对内部排序方法进行分类,则大致可分为插入排序、交换排序,选择排序,归并排序和计数排序等五类;如果按内部排序过程中所需要的工作量来区分,则可分为3类:(1)简单的排序方法,该时间复杂度为O(n*n);(2)先进的排序方法,该时间复杂度为O(nlogn);(3)基数排序,其时间复杂度为O(d*n);主要介绍非常实用而算法又容易接受的的这六类排序。

由于很多人在使用的过程中,不知道那种排序适合他们的程度设计,因此导致该算法没有得到充分的应用,起泡排序最简单的排序,很容易写出代码,但运算时间复杂度稍长一些;直接排序能够很快的最大和最小的数据,但假如数据较多,操作比较繁琐;简单选择排序稳定比较次数与起泡排序一样,则相对之还要慢;快速排序速度快,数据移动少,平均性能比较好,但是性能不稳定;希尔排序是插入算法的改进,由于多次的插入造成了其稳定性不好;堆排序在最坏情况下时间复杂度也为O(nlogn),并且它仅需一个记录大小供交换用的辅助存储空间,但在记录数较少时不提倡使用;但本文主要介绍这6类排序(起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序)一些优点和缺陷,对缺陷加以改进。

C++版数据结构各种内部排序比较课程设计

C++版数据结构各种内部排序比较课程设计

****课程设计报告题目:各种内部排序性能比较学生姓名:彭伟奇学号: 1021112417班级:10211124指导教师:高永平2012年6 月15 日一、课程设计目的本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

二、实验要求任务:用程序实现插入法排序、起泡法、选择法、快速法、合并法排序;输入的数据形式为任何一个正整数,大小不限。

输出的形式:数字大小逐个递增的数列。

功能要求:给出多组不同元素个数的输入数据(可考虑用随机函数生成整数,而不用人工输入),并用列表打印出每种排序下的各趟排序结果。

每个排序法结束时应打印出其元素比较的次数和交换的次数。

此程序需将结果用列表打印,一定要将其打印结果排列好。

三、程序源代码#include "stdlib.h"#include"stdio.h"#include"time.h"#define MAXSIZE 200typedef int KeyType;typedef struct //定义存储记录关键字及其他信息的结构体{ KeyType key;char other;}RedType;typedef struct //定义存储所有记录的结构体{ RedType r[MAXSIZE+1];int length;}SqList;typedef struct{int move; /*记录数据移动次数*/int comp; /*记录数据比较次数*/}Recode;int dlta[5]={31,15,7,3,1}; //初始化希尔排序的增量序列int num[10]={0}; //记录每个排序方法的移动次数和比较次数int flag=0; //标记变量//利用产生的随即数模拟用户输入的数据class sort{public:void select_sort(SqList L);void Zhijie(SqList L) ;void ShellInsert(SqList *L,int dk,Recode *r);void ShellSort(SqList L,int dlta[],int t) ;void Maopao(SqList L);int Partition(SqList *L,int low,int high,Recode *r); void QuickSort(SqList L) ;protected:int dk,dlta[5],t,low,high;};void create(SqList *L,int length){ int i;srand(time(0));L->length=length;for(i=1;i<=L->length;i++){L->r[i].key=rand()%1000;L->r[i].other=rand()%5;}}/*输出元素*/void visit(SqList L){int i;printf("\n");for(i=1;i<=L.length;i++)printf("%4d%2c",L.r[i].key,L.r[i].other);printf("\n");}/*简单选择排序*/void select_sort(SqList L){ Recode r;p =0;r.move =0;int i,j,k;RedType t;for (i=1;i<L.length;i++){ j=i;for (k=i+1;k<=L.length;k++){ p++;if (L.r[j].key>L.r[k].key){j=k;}}if (i!=j){t=L.r[j];L.r[j]=L.r[i];L.r[i]=t;r.move =r.move +3;}}if(!flag){ printf("本次随机数据排序的移动次数为:");printf("%d\n",r.move);printf("本次随机数据排序的比较次数为:");printf("%d\n",p);printf("简单选择排序后的结果:");visit(L);}else{num[0]=r.move;num[1]=p;}}//直接插入排序void Zhijie(SqList L){ Recode r;p =0;r.move =0;int j;for(int i=2;i<=L.length;++i){ p ++;if(L.r[i].key<L.r[i-1].key){L.r[0]=L.r[i]; //复制为哨兵L.r[i]=L.r[i-1];r.move=r.move +2;for(j=i-2;L.r[0].key < L.r[j].key;--j){L.r[j+1]=L.r[j]; //记录后移r.move ++;p ++;}L.r[j+1]=L.r[0]; //插入到正确位置r.move ++;}}if(!flag){printf("本次随机数据排序的移动次数为:");printf("%d\n",r.move);printf("本次随机数据排序的比较次数为:");printf("%d\n",p);printf("直接插入排序后的结果:");visit(L);}else{num[2]=r.move;num[3]=p;}}void ShellInsert(SqList *L,int dk,Recode *r){ int i,j;for(i=dk+1;i<=L->length ;++i){ r->comp ++;if(L->r[i].key<L->r[i-1].key){ L->r[0]=L->r[i]; //暂存r->move ++;for(j=i-dk;j>0&&(L->r[0].key < L->r[j].key);j-=dk){ L->r[j+dk]=L->r[j]; //记录后移r->move ++;r->comp ++;}L->r[j+dk]=L->r[0]; //插入到正确位置r->move ++;}}}void ShellSort(SqList L,int dlta[],int t){ //按增量序列dlta[0..t-1]对顺序表L作希尔排序。

课程设计报告-内部排序算法的性能分析

课程设计报告-内部排序算法的性能分析

目录内部排序算法的性能分析 (1)1 引言 (1)1.1设计背景 (1)1.2设计目的 (2)1.3设计内容 (2)1.4设计过程 (3)1.5编程环境 (3)2 系统功能分析 (3)2.1问题定义 (3)2.2可行性分析 (4)2.3需求分析 (4)3 总体设计 (5)3.1数据流程图 (5)3.2系统总体结构 (6)3.3文件组织结构 (6)3.4数据结构定义 (7)3.5函数接口说明 (8)3.6功能宏说明 (8)3.7性能比较方法 (9)4 详细设计 (10)4.1直接排序 (10)4.2起泡排序 (11)4.3选择排序 (11)4.4快速排序 (12)4.5希尔排序 (13)4.6堆排序 (13)4.7总结和实现 (14)5 系统实现及数据分析 (15)5.1系统实现 (15)5.2数据分析 (15)6 结束语 (18)参考文献 (19)程序清单 (20)内部排序算法的性能分析学生姓名:方山城指导老师:卢曼莎摘要在数据结构课程中,内部排序算法是相当重要的一部分,而在实际应用中,内部排序算法极大地影响着系统资源的分配。

在本文中,通过编码用C语言实现测试程序对常见的六种排序算法性能从比较次数、移动次数和消耗时间方面进行了对比,分析数据得出结论,为在实际应用中选择合适排序算法提供了实验依据。

关键词内部排序;性能;比较次数;移动次数;时间消耗1 引言1.1设计背景排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的、任意序列,重新排列成一个关键字有序序列。

在本学期的数据结构课程中,排序也是一个重要部分。

除了课程学习之外,排序也广泛应用于数据处理、情报检索、商业金融及企业管理等许多方面。

在计算机数据处理中,特别是在事务处理中,排序占了很大比重,一般认为有1/4的时间用在排序上,而对安装程序,多达50%的时间花费在对表的排序上[1].在本学期的数据结构课程[2]中,书上介绍的多种排序算法从算法原理,实现以及时间复杂度等方面进行了比较详细介绍,但对于各种算法的性能分析仅仅是停留在时间复杂度层面上,没有比较直观的对常见的六种排序算法性能的对比,所以,在学习过程中亟需通过实践设计深入的理解各种排序算法性能差异。

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

目录1、问题描述: (2)1.1题目内容: (2)1.2基本要求: (2)1.3测试数据: (2)2、需求分析: (2)2.1程序的基本功能: (2)2.2输入值、输出值以及输入输出形式: (2)2.3各个模块的功能要求: (2)3、概要设计: (3)3.1所需的ADT,每个程序中使用的存储结构设计说明 (3)3.2主程序流程以及模块调用关系 (3)3.3每个模块的算法设计说明(流程图) (4)3.3.1气泡排序: (4)3.3.2直插排序 (5)3.3.3选择排序 (6)3.3.4希尔排序 (7)3.3.5快速排序 (8)4、详细设计: (9)4.1函数调用关系图 (9)5、各个算法实现的源程序: (9)5.1、冒泡排序及其主要算法 (9)5.2、直接插入排序及其主要算法 (10)5.3、选择排序及其主要算法 (10)5.4、希尔排序及其主要算法 (11)6、调试分析: (12)7、使用说明: (13)8、测试结果: (14)9、主要参考文献 (14)1、问题描述:1.1题目内容:内部排序算法实现与性能分析1.2基本要求:(1)数据结构定义(2)利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、希尔等排序方法进行排序,并统计每一种排序上机所花费的时间,对各种排序算法做分析比较.1.3测试数据:由函数随机产生的数据,由于是随机产生的,所以在此不一一写出。

2、需求分析:2.1程序的基本功能:输入30000个随机整数,对这些数进行多种方法进行排序,并对这些排序做比较,在屏幕上输出每种排序方法所比较的次数,交换的次数,和时间复杂度。

2.2输入值、输出值以及输入输出形式:由于程序中所需的数据都是有函数随机生成的整形数,不需要用户自己输入,用户只需要对演示程序中的一些提示做一些必要的选择以便于程序的执行。

程序输出的是对六种排序做的一些比较,即输出六种排序各排序过程中所比较的数据的个数,交换的数据的次数,和排序完成所用的时间。

六种排序依次在计算机终端上显示,便于用户观察。

2.3各个模块的功能要求:一、随机函数:产生随机数二、选择排序函数:对随机数进行选择排序三、起泡排序函数:对随机数进行气泡排序四、直接插入函数:对随机数进行直接插入排序五、希尔排序函数:对随机数进行希尔排序六、快速排序函数:对随机数进行快速排序七、主函数3、概要设计:3.1所需的ADT,每个程序中使用的存储结构设计说明typedef struct{int key;}ElemType;//元素类型typedef struct{ElemType *elem;int length;}SqList;//顺序表类型3.2主程序流程以及模块调用关系主函数main()初始化变量x,i;; 初始化线性表SqListL;Showthe menu显示主界面五种排序运行后打印结果五种排序用时的比较,不打印排序后的结果3.3每个模块的算法设计说明(流程图)3.3.1气泡排序:开始初始变量 i=1,j=1i 小于L.lengthj 小于L.lengthL.elem[j].key 大于L.elem[j+1].key交换第j 个和第j+1个元素j++YYY结束N开始初始变量i=2,ji<=L.lengt hY如果第i位比第i-1位的值小L.elem[0].key=L.elem[i].keyYj=i-1NN如果第0位比第j位的值小记录后移j=j-1L.elem[j+1].key=L.elem[0].keyY结束开始初始变量i=1,j,kI<lengthJ=i+1Y如果i位置上的值<=k位置上的交换数值位置Yj=j+1i=i+1结束N N开始Y结束N初始化变量 i,d=L.length/2,j,w=0w 小于di=1,i 小于L.length j=i+dJ 小于L.length第i 个元素大于第j 个元素交换第i 个元素第j 个元素d 变为原来的一半YYY开始结束NY Y初始化变量pivotkey,low,highLow小于high第high个元素大于pivotkey 第low个元素小于pivotkey第low个元素与第high个元素交换第high个元素与第low个元素交换high-- Low++Y4、详细设计:4.1函数调用关系图5、各个算法实现的源程序:5.1、冒泡排序及其主要算法void qipao(SqList &L)//起泡 {start_t=clock(); int i=1,j;while(i<L.length) {for(j=1;j<L.length;j++) {if(L.elem[j].key>L.elem[j+1].key) {L.elem[0].key=L.elem[j].key; L.elem[j].key=L.elem[j+1].key; L.elem[j+1].key=L.elem[0].key; }开始界面各排序输出结果 起泡 排 序 直插 排 序 选择 排 序 希尔排 序 快速 排 序各种排序用时比较起泡 排 序 用时 直插 排 序 用时 选择 排 序 用时 希尔 排 序 用时 快速 排 序 用时}i++;}5.2、直接插入排序及其主要算法void InsertSort(SqList &L) //直接插入{start_t=clock();int i,j;for(i=2;i<=L.length;i++){if(L.elem[i].key<=L.elem[i-1].key)//“<”,需将L.r[i]插入有序子序列{L.elem[0].key=L.elem[i].key; //复制为哨兵j=i-1;while(L.elem[0].key<L.elem[j].key){L.elem[j+1].key=L.elem[j].key; //记录后移j--;}L.elem[j+1].key=L.elem[0].key; //插入到正确位置}}5.3、选择排序及其主要算法void SelectSort(SqList &L)//选择{int i,j,k,;for(i=1;i<L.length;i++)//选择第i小的记录,并交换到位{for(j=i+1;j<L.length;j++){if(L.elem[j].key<=L.elem[k].key){L.elem[0].key=L.elem[i].key;L.elem[i].key=L.elem[k].key;L.elem[k].key=L.elem[0].key;//与第i个记录交换}}5.4、希尔排序及其主要算法void xier(SqList &L)//希尔排序并打印结果{start_t=clock();int i,d=L.length/2,j,w=0,k,yd=0,bj=0; //间长为dwhile(w<d){for(i=1;i<=L.length;i++) //第i个与第i+d个相比较{j=i+d;if(j<=L.length){if(L.elem[i].key>L.elem[j].key){k=j;bj++;if(i!=k){L.elem[0].key=L.elem[i].key;L.elem[i].key=L.elem[k].key;L.elem[k].key=L.elem[0].key;}}}}d=d/2;//间隔变为原来的一半}5.5、快速排序及其主要算法int Partition(SqList &L,int low,int high)//快速排序{int pivotkey;L.elem[0]=L.elem[low];yd1++;pivotkey=L.elem[low].key; //用子表的第一个记录作曲轴记录while (low<high) //从子表的两端交替的向中间扫描{yd1++;while(low<high&&L.elem[high].key>=pivotkey)--high;L.elem[low]=L.elem[high]; //将比轴记录小的记录交换到低端while (low<high&&L.elem[low].key<=pivotkey)L.elem[high]=L.elem[low]; //将比轴记录大的记录交换到高端}L.elem[low]=L.elem[0];return low; //返回曲轴所在位置}void QSort(SqList &L,int low,int high){ //对顺序表L.r[low..high]做快速排序int pivotloc;int i=1;if(low<high) //长度大于一{pivotloc=Partition(L,low,high);//将L.r[low..high]一分为二QSort(L,low,pivotloc-1); //对低字表递归排序QSort(L,pivotloc+1,high); //对高字表递归排序}}void QuickSort(SqList &L){ //对顺序表L做快速排序int j;BeforeSort();QSort(L,1,L.length);for(j=1;j<=L.length;j++)printf("%d ",L.elem[j]);display(yd1,bj1);}6、调试分析:1.产生随机数2.排序3.汇总7、使用说明:本演示程序对以下5种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序。

由系统生成30000个随机整数进行比较。

程序还可以考虑几组数据的典型性,如:正序、逆序和不同程度的乱序。

注意采用分块调试的方法。

在该程序中可能回有很多让人不满意的地方,我会在以后的学习中逐加改进的。

8、测试结果:9.主要参考文献1.严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,1997 2.朱战立.数据结构.西安:西安电子科技大学出版社,20043.严蔚敏,吴伟民.数据结构题集(C语言版).北京:清华大学出版社,2000。

相关文档
最新文档