数据结构课程设计排序算法集成.docx
《数据结构课程设计排序算法集成.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计排序算法集成.docx(22页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计排序算法集成.docx](https://file1.bdocx.com/fileroot1/2023-6/25/64a186dd-3b55-4b17-b1e4-17c3a37e5e4d/64a186dd-3b55-4b17-b1e4-17c3a37e5e4d1.gif)
数据结构课程设计排序算法集成
xx大学
本科生课程设计论文
题 目:
排序算法集成
学生姓名:
学号:
专 业:
计算机
班 级:
指导教师:
2013年5月20日
xx大学课程设计任务书
课程名称
数据结构课程设计
设计题目
排序算法集成
指导教师
时间
2013、5、20-2013、5、30
一、教学要求
1、掌握数据结构与算法得设计方法,具备初步得独立分析与设计能力
2、初步掌握软件开发过程得问题分析、系统设计、程序编码、测试等基本方法与技能
3、 提高综合运用所学得理论知识与方法独立分析与解决问题得能力
4、训练用系统得观点与软件开发一般规范进行软件开发,培养软件工作者所应具备得科学得工作方法与作风
二、设计资料及参数
每个学生在教师提供得课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
排序算法集成
定义动态数组类(或类模板)以表示待排序数据,在此基础上实现多种排序算法。
要求设计函数模板来实现下列排序算法:
v直接插入排序
v冒泡排序
v简单选择排序
v希尔排序
v快速排序
v堆排序
并设计主函数测试动态数组类(或类模板),测试各排序算法得函数模板。
三、设计要求及成果
1、分析课程设计题目得要求ﻫ2、写出详细设计说明ﻫ3、编写程序代码,调试程序使其能正确运行ﻫ4、设计完成得软件要便于操作与使用ﻫ5、设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统得开发与测试(5天)
编写课程设计说明书与验收(2天)
五、评分标准
1、根据平时上机考勤、表现与进度,教师将每天点名与检查
2、 根据课程设计完成情况,必须有可运行得软件。
ﻫ3、根据课程设计报告得质量,如有雷同,则所有雷同得所有人均判为不及格。
4、根据答辩得情况,应能够以清晰得思路与准确、简练得语言叙述自己得设计与回答教师得提问
六、建议参考资料
1.《数据结构 (C语言版)》严蔚敏、吴伟民主编 清华大学出版社2004、11
2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等 编著,清华大学出版社2007、2
3、《数据结构:
用面向对象方法与C++语言描述》,殷人昆 主编, 清华大学出版社2007、6
目录ﻩ3
引言4
一.算法得设计思想4
二.算法得流程图ﻩ4
三.算法得设计与分析5
3、1ﻩ建立数组ﻩ5
3、2 算法思想5
3、3ﻩ主要函数6
3、4ﻩ主要函数声明ﻩ6
3、5主要变量说明ﻩ10
四.程序源代码ﻩ11
五.运行结果与分析(测试)18
六.总结(收获与体会)20
七.参考文献21
引言
本课程设计主要解决几种不同排序方法以及在各种不同排序得过程中某一趟得具体排序结果。
通过观察各种排序得具体排序过程,加深对不同排序方法得认识,加深对不同排序算法得掌握。
一.算法设计得思想
数据结构就是与数据相关得一门重要学科,不论就是想通过升学考试还就是想把程序编得有水平,都要对这门学科下一点功夫才行。
而课程设计就是让我们更好得掌握这门学科得重要方式。
排序就是计算机程序中得一种重要操作,它得功能就是将一个数据元素(或记录)得任意序列重新排列成一个按关键字有序得序列 。
而内部排序中包括各种不同得排序,本课程设计主要讨论得就是插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。
完成这几种排序最主要得就就是弄好不同排序得算法,只有深刻得认识了这不同排序得算法,才能了解不同排序得优点与缺点。
通过对不同排序算法得分析,了解它们得优劣特点。
据对题目得分析,首先要根据插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序得不同算法,写出实现各个排序算法得函数。
然后通过在主函数中对不同排序得子函数得调用来实现对某个序列得具体排序。
内部排序得方法很多,但就其全面性而言,很难提出一种被认为就是最好得方法,每一种方法都有各自得优缺点,适合不同得环境。
通常,在排序得过程中需进行两种基本操作:
(1)比较两个关键字得大小;
(2)将记录从一个位置移动至另一位置。
前一个操作对大多数排序方法来说都就是必要得,而后一个操作可以通过改变记录得存储方式来予以避免。
二.算法得流程图
如图2、1
建立数组
设计main函数
建立各排序函数
结束
开始
图2、1主要设计思想流程图
三.算法得设计与分析
3、1建立数组
在程序中建立一个数组data[],用于存储程序运行中得数据。
3、2算法思想
(1)插入排序
插入排序得主要算法思想就是将一个记录插入到已排好得有序表中,从而得到一个新得、记录数增1得有序表。
(2)希尔排序
希尔排序得基本思想就是先将整个待排记录列分割成若干子序列分别进行直接插入排序,待整个序列中得记录“基本有序”时,再对全体记录进行一次直接插入排序。
(3)冒泡排序函数
冒泡排序首先将第一个记录得关键字与第二个记录得关键字进行比较,若为逆序则将两个记录交换,然后比较第二个记录与第三个记录得关键字,依次类推。
(4)选择排序函数
选择排序得基本思想就是:
每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小得记录作为有序序列中第i个记录。
(5)堆排序
先将一个序列进行建堆,然后将大顶堆得第一个元素与最后一个元素对换(或将小顶堆得最后一个元素与第一个元素对换),再对除最后一个元素得序列进行求大顶堆(或对除第一个元素得序列进行求小顶堆),依次类推。
3、3主要函数
(1)插入排序函数
voidinsertion_sort(int[],int);/*插入排序*/
(2)希尔排序函数
void shell_sort(int[],int);/*希尔排序*/
(3)冒泡排序函数
voidbubble_sort(int[],int);/*冒泡排序*/
(4)选择排序函数
voidselect_sort(int[],int);/*选择排序*/
(5)将数据调整为堆得函数
voidadjust(int,int);/*将数据调整为堆树*/
3、4主要函数声明
①插入排序
插入排序得主要算法思想就是将一个记录插入到已排好得有序表中,从而得到一个新得、记录数增1得有序表。
void insertion_sort(intdata[],intsize)/*插入排序*/
{intbase,pare,temp,i,j=0;
for(base=1;base
否则与后面数据对比找出插入位置*/
{temp=data[base];
pare=base;
j++;
while(pare>0&& data[pare-1]>temp)
{data[pare]=data[pare-1];
pare--;
}
data[pare]=temp;
printf("第%d趟排序:
",j);
for(i=0;i printf("%d",data[i]);
printf("\n");
}
printf("\n最终排序结果:
");
for(i=0;i<size;i++)
printf("%d",data[i]);
printf("\n");
}
②希尔排序
希尔排序得基本思想就是先将整个待排记录列分割成若干子序列分别进行直接插入排序,待整个序列中得记录“基本有序”时,再对全体记录进行一次直接插入排序。
voidshell_sort(intdata[],intsize)/*希尔排序*/
{
inti,j,k,incr,temp,num=0;
incr=size/2;
printf("\n");
while(incr>0)
{
ﻩfor(i=incr+1;i<size;i++)
{j=i-incr;
while(j>0)
if(data[j]>data[j+incr])/*比较每部分得数据大小顺序不对则交换*/
{temp=data[j];
data[j]=data[j+incr];
ﻩ data[j+incr]=temp;
j=j-incr;
}
else
j=0;
}
num++;
printf("\n第%d趟排序:
",num);
for(k=1;k
printf("%d",data[k]);
incr=incr/2;
}
printf("\n最终排序结果:
");
for(i=1;i printf("%d ",data[i]);
printf("\n");
}
③冒泡排序
冒泡排序首先将第一个记录得关键字与第二个记录得关键字进行比较,若为逆序则将两个记录交换,然后比较第二个记录与第三个记录得关键字,依次类推。
voidbubble_sort(int data[],int size)/*冒泡排序*/
{inti,j,flag,k,temp,num=0;
for(i=0;i {flag=0;
for(j=0;j
{if(data[j]>data[j+1])
{flag=1;
temp=data[j];
ﻩ data[j]=data[j+1];
ﻩdata[j+1]=temp;
}
ﻩnum++;
ﻩ printf("\n第%d趟排序:
",num);
for(k=0;kﻩprintf("%d",data[k]);
printf("\n");
}
printf("\n最终排序结果:
");
for(i=0;i printf("%d ",data[i]);
printf("\n");
if(flag!
=1)
ﻩ break;
}
}
④选择排序
选择排序得基本思想就是:
每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小得记录作为有序序列中第i个记录。
voidselect_sort(intdata[],int size)/*选择排序*/
{int base,pare,min,temp,i,num=0;
for(base=0;base<size-1;base++)/*将目前数据与后面数据中最小得对调*/
{min=base;
for(pare=base+1;pare
ﻩ if(data[pare]<data[min])
ﻩmin=pare;
ﻩtemp=data[min];
ﻩdata[min]=data[base];
data[base]=temp;
num++;
printf("第%d趟排序:
",num);
ﻩfor(i=0;i<size;i++)
ﻩﻩprintf("%d ",data[i]);
ﻩ printf("\n");
}
printf("\n最终排序结果:
");
for(i=0;iprintf("%d ",data[i]);
printf("\n");
}
3、5主要变量说明
Intdata[]:
整型数组,用于储存序列
Intsize:
整型变量,用于记录序列长度
Inttemp:
整型变量,用于交换元素
Int m,n,k,i,j,num:
一般整型变量
四.程序源代码
#include<stdio、h>
voidinsertion_sort(int[],int);/*插入排序*/
voidshell_sort(int[],int);/*希尔排序*/
voidbubble_sort(int[],int);/*冒泡排序*/
voidselect_sort(int[],int);/*选择排序*/
voidadjust(int,int);/*将数据调整为堆树*/
void insertion_sort(intdata[],int size)/*插入排序*/
{intbase,pare,temp,i,j=0;
for(base=1;base<size;base++)/*当数据小于第一个时,则插于前方,否则与后面数据对比找出插入位置*/
{temp=data[base];
pare=base;
j++;
while(pare>0 &&data[pare-1]>temp)
{data[pare]=data[pare-1];
pare--;
}
data[pare]=temp;
printf("第%d趟排序:
" ,j);
for(i=0;iprintf("%d ",data[i]);
printf("\n");
}
printf("\n最终排序结果:
");
for(i=0;iprintf("%d",data[i]);
printf("\n");
}
voidshell_sort(intdata[],intsize)/*希尔排序*/
{
int i,j,k,incr,temp,num=0;
incr=size/2;
printf("\n");
while(incr>0)
{
for(i=incr+1;i
ﻩ{j=i-incr;
while(j>0)
if(data[j]>data[j+incr])/*比较每部分得数据大小顺序不对则交换*/
{ﻩtemp=data[j];
data[j]=data[j+incr];
ﻩdata[j+incr]=temp;
j=j-incr;
}
else
j=0;
}
num++;
printf("\n第%d趟排序:
",num);
for(k=1;kprintf("%d ",data[k]);
incr=incr/2;
}
printf("\n最终排序结果:
");
for(i=1;i<size;i++)
printf("%d",data[i]);
printf("\n");
}
void bubble_sort(intdata[],intsize)/*冒泡排序*/
{int i,j,flag,k,temp,num=0;
for(i=0;i{flag=0;
for(j=0;j {if(data[j]>data[j+1])
{ flag=1;
ﻩtemp=data[j];
ﻩdata[j]=data[j+1];
ﻩ data[j+1]=temp;
}
num++;
printf("\n第%d趟排序:
",num);
for(k=0;k<size;k++)
printf("%d",data[k]);
printf("\n");
}
printf("\n最终排序结果:
");
for(i=0;iprintf("%d",data[i]);
printf("\n");
if(flag!
=1)
ﻩ break;
}
}
voidselect_sort(intdata[],int size)/*选择排序*/
{intbase,pare,min,temp,i,num=0;
for(base=0;base {min=base;
for(pare=base+1;pareﻩif(data[pare]<data[min])
ﻩ min=pare;
temp=data[min];
data[min]=data[base];
data[base]=temp;
num++;
printf("第%d趟排序:
",num);
for(i=0;iprintf("%d",data[i]);
printf("\n");
}
printf("\n最终排序结果:
");
for(i=0;i<size;i++)
printf("%d",data[i]);
printf("\n");
}
voidadjust(inti,intn)/*将数据调整为堆树*/
{int data[20],j,k,done=0;
k=data[i];
j=2*i;
while((j<=n)&&(done==0))
{if((j<n)&&(data[j] if(k>=data[j])done=1;
else
{data[j/2]=data[j];
j=2*j;
}
}
data[j/2]=k;
}
void main()
{intdata[20];
intsize=0,m=0,i,j,num,k,temp,n=0;
printf("\n请输入初始关键字(输入0结束):
\n");
do
{
scanf("%d",&data[size]);
m++;
}
while(data[size++]!
=0);
printf("您输入得初始关键字为:
");
for(j=0;jprintf("%d ",data[j]);
printf("\n排序方法:
\n");
printf("\n1、插入排序\n");
printf("\n2、希尔排序\n");
printf("\n3、冒泡排序\n");
printf("\n4、选择排序\n");
printf("\n5、堆排序\n");
printf("\n请选择排序方法:
\n");
scanf("%d",&num);
switch(num)
{case1:
printf("****************插入排序************\n");
for(i=0;i<50;i++)printf("-");printf("\n");
insertion_sort(data,--size);
for(i=0;i<50;i++)printf("-");printf("\n");
break;
case 2:
printf("****************希尔排序************\n");
ﻩfor(m=0;m<50;m++)printf("-");
shell_sort(data,--size);
for(i=0;i<50;i++)printf("-");printf("\n");
break;
case 3:
printf("****************冒泡排序************\n");
ﻩfor(i=0;i<50;i++)printf("-");printf("\n");
bubble_sort(data,--size);
for(i=0;i<50;i++)printf("-");printf("\n");
break;
case4:
ﻩprintf("****************选择排序************\n");
for(i=0;i<50;i++)printf("-");printf("\n");
select_sort(data,--size);
for(i=0;i<50;i++)printf("-");printf("\n");
break;
case5:
ﻩsize=size-1;
printf("*****************堆排序*************\n");
for(i=0;i<50;i++)printf("-");
ﻩfor(i=size/2;i>0;i--)
adjust(i,size);
printf("\n堆:
");
ﻩfor(k=1;kﻩprintf("%d ",data[k]);
for(i=size-2;i>0;i--)
ﻩ{temp=data[i+1];
data[i+1]=data[1];
ﻩdata[1]=temp;/*将树根与最后得节点交换*/
ﻩadjust(1,i);/*再重新调整为堆树*/
n++;
printf("\n第%d趟排序:
",n);
for(k=1;k
ﻩﻩprintf("%d ",data[k]);
}
printf("\n最终排序结果:
");
for(k=1;k printf("%d ",data[k]);
printf("\n");
for(i=0;i<50;i++)printf("-");printf("\n");
break;
}
}
五.运行结果与分析(测试)
(1)程序开始如图4、1
图4、1程序开始界面
(2)输入关键字以后如图4、2
图4、2 输入关键字以后界面
(3)在输入关键字后得排序方法选择如图4、3
图4、3在输入关键字后得排序方法选择界面
(4)输入1,输出插入排序结果如图4、4
图4、4插入排序输出结果界面
(5)输入2,输出希尔排序结果如图4、5
图4、5希尔排序输出结果界面
(6)输入3,输出冒泡排序结果如图4、6
图4、6冒泡排序输出结果
(7)输入4,输出选择排序结果如图4、7
图4、7选择排序输出结果界面
(8)输入5,输出堆排序结果如图4、8
图4、7堆排序输出结果界面
六.总结(收获与体会)
做这个课程设计,我收获了很多。
在课程设计中我遇到了一些平时做作业所没遇到、也不可能遇到得问题。
在做课程设计得过程中,加深了对书本知识得理解,同时也培养了自己得动手能力。
因为上学期做过一次C语言得课程设计,对于课程设计有了一些经验了吧,从总体上来说还算比较顺利,只就是之前忙于准备考试,之后做课程设计感觉时间有点紧,应该就是我在时间安排上有点问题吧。
这次课程设计,就是将这一学期学到得论知识用于了实践,在我在实践中得到了很多经验。
在瞧到在自己付出了努力所做出来得成果时,我感到非常得欣慰。
最后我还要感谢我得指导老师,感谢在我遇到问题时帮我解决问题得同学,没有您们得帮助我就是不可能做好得。
我以后还要更加努力,不辜负老师与家人得期望。
七.参考文献
[1] 《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004、11
[2]《数据结构题集(C语言版)》严蔚敏、吴伟民主编