数据结构课设 排序算法.docx
- 文档编号:5854606
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:112.86KB
数据结构课设 排序算法.docx
《数据结构课设 排序算法.docx》由会员分享,可在线阅读,更多相关《数据结构课设 排序算法.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课设排序算法
HUBEIUNIVERSITYOFAUTOMOTIVETECHNOLOG
数据结构
课程设计报告
课设题目:
多种排序方法的比较
专业:
计算机科学与技术
班级:
姓名:
完成日期:
指导教师:
一、设计题目
多种排序方法的比较(直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序)
二、设计目的
排序算法是是计算机程序设计、数据库、操作系统、编译原理及人工智能等的
重要基础,广泛应用于信息学、系统工程等各种领域。
学习排序算法是为了将实际
问题中涉及的对象在计算机中进行处理。
要求掌握多种排序方法的基本思想,如直接插入、冒泡、简单选择、快速、堆、希尔排序等排序方法,并能够用高级语言实现。
本程序利用随机函数产生N个随机整数,利用直接插入排序、折半插入排序,起泡排序、快速排序、选择排序排序五种排序方法进行排序(结果为由小到大的顺序),并显示每种排序所需的比较次数及平排序结果。
三、总体设计
(一)程序的主要功能:
1.用户输入任意个数,或产生相应的随机数
2.用户可以自己选择排序方式(直接插入排序、折半插入排序、冒泡排序、快速排序、选择排序)的一种。
3.程序给出原始数据、排序后从小到大的数据,并给出排序的比较次数及排序结果。
(二)程序运行流程图:
4、详细设计
1、运行环境:
MicrosoftVisualc++
2、程序实现功能:
通过用户键入的插入排序数据,经过程序进行排序,最后给予数据由小到大的输出。
并显示交换次数和比较次数和排序的方式包含教材中所介绍的几种常用的排序方式:
直接、折半插入排序、冒泡排序、快速排序、选择排序。
3、程序的输入:
输入排序的数据的个数。
输入具体的数据元素。
输入选择的排序方法序号。
4、程序的输出:
各种排序方法的排序结果以及各种排序的比较次数和交换次数。
5、各个排序的算法思想:
(1)直接插入排序:
将一个记录插入到已排好的有序表中,从而得到一个新的,记录数加1的有序表。
(2)折半插入排序:
插入排序的基本插入是在一个有序表中进行查找和插入,这个查找可利用折半查找来实现,即为折半插入排序。
(3)冒泡排序:
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。
依此类推,直到第N-1和第N个记录的关键字进行过比较为止。
上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。
然后进行第二趟起泡排序,对前N-1个记录进行同样操作。
一共要进行N-1趟起泡排序。
(4)快速排序:
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。
(5)选择排序:
通过N-I次关键字间的比较,从N-I+1个记录中选出关键字最小的记录,并和第I(1<=I<=N)个记录交换。
五、设计结果与分析
1.程序的性能分析,
时空分析:
直接插入排序(稳定的排序方法)
1时间复杂度
A.直接插入排序。
1)若待排序记录按关键字从小到大排列(正序)
关键字比较次数:
记录移动次数:
2(n-1)
2)若待排序记录按关键字从大到小排列(逆序)
关键字比较次数:
记录移动次数:
3)若待排序记录是随机的,取最好和最坏情况的平均值
关键字比较次数(约为):
记录移动次数(约为):
2空间复杂度:
S(n)=O
(1)
B.折半插入排序(稳定的排序算法)
就平均性能而言,因为折半查找优于顺序查找,所以折半插入排序也优于直接插入排序。
关键字的比较次数为:
n*log2(n)
C.冒泡排序(稳定的排序算法)
1.时间复杂度:
a)最好情况(正序)
b)比较次数:
n-1(只要进行一趟即可)
c)移动次数:
0
d)最坏情况(逆序)
e)比较次数:
(需n-1趟,每趟达到最大比较次数)
f)移动次数:
在最坏情况下,时间复杂度为:
T(n)=O(n²)
2.空间复杂度:
S(n)=O
(1)
D.简单选择排序(不稳定的排序方法)
3.时间复杂度:
O(n2)。
4.空间复杂度:
S
(1)。
E.快速排序(不稳定的排序方法)
1.时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)
最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²)
2.空间复杂度:
需栈空间以实现递归
最坏情况:
S(n)=O(n)
一般情况:
S(n)=O(log2n)
f.堆排序(不稳定的排序方法)]
1.间复杂性为O(nlog2n)。
2空间复杂性为O
(1)。
g.归并排序(稳定的排序方法)
1时间复杂度为O(nlog2n)。
2空间复杂度为O(n)。
2、程序的运行结果
1.直接插入排序
2.折半插入排序
3.冒泡排序
4.简单选择排序
5快速排序
7、附录(源代码)
#include
#include
#include
#include
typedefstructSqList//顺序表存储结构
{
int*elem;
intlength;
}SqList;
voidInsertSort(SqList&L);//直接插入排序
voidBInsertSort(SqList&L);//折半插入排序
voidBubbleSort(SqList&L);//冒泡排序
voidSelectSort(SqList&L);//简单选择排序
voidQuickSort(SqList&L);//快速排序
voidQSort(SqList&L,intlow,inthigh);
intPartition(SqList&L,intlow,inthigh);
voidprint_data(intdata[],intnum);//输出数据
voidprint1_data(intdata[],intnum);//输出数据
staticintnumber=1;
SqListL;
SqListL1;
SqListtemp;
voidinput(intn)
{
int*p;
srand((unsigned)time(NULL));
if((p=(int*)malloc((n+1)*sizeof(int)))==0)//动态分配顺序表存储空间
{
printf("Notabletoallocatememory.\n");
exit
(1);
}
L.elem=p;
L.length=n;
if((p=(int*)malloc((n+1)*sizeof(int)))==0)//动态分配顺序表存储空间
{
printf("Notabletoallocatememory.\n");
exit
(1);
}
L1.elem=p;
L1.length=n;
temp.elem=p;
temp.length=n;
for(inti=1;i<=L.length;i++){
L.elem[i]=(rand()%50)-25;
temp.elem[i]=L.elem[i];
printf("%7d",L.elem[i]);
}
system("PAUSE");
}
voidrecover(){
for(inti=1;i<=L.length;i++){
L.elem[i]=temp.elem[i];
}
}
intmain(void)
{
intn;
intchange=0;
printf("请输入顺序表的长度:
");
scanf("%d",&n);
input(n);
while
(1){
number=1;
system("CLS");
recover();
system("CLS");
printf("\t\t------选择排序算法:
--------\n");
printf("\t\t\t1直接插入排序\n");
printf("\t\t\t2折半插入排序\n");
printf("\t\t\t3冒泡排序\n");
printf("\t\t\t4简单选择排序\n");
printf("\t\t\t5快速排序\n");
printf("\t\t\t8退出\n");
printf("\t\t\t请输入你的选择:
");
scanf("%d",&change);
switch(change)
{
case1:
InsertSort(L);break;
case2:
BInsertSort(L);break;
case3:
BubbleSort(L);break;
case4:
SelectSort(L);break;
case5:
QuickSort(L);break;
case8:
exit(0);
default:
break;
}
printf("排序后为:
");
for(inti=1;i<=L.length;i++)
printf("%6d",L.elem[i]);
printf("\n");
system("PAUSE");
}
return0;
}
voidInsertSort(SqList&L)//直接插入排序
{
inti=0,j=0,n=0;
for(i=1;i<=L.length;i++){
if(L.elem[i] { for(j=i-2;L.elem[j]>L.elem[0];j--) L.elem[j+1]=L.elem[j]; L.elem[j+1]=L.elem[0]; } } } voidBInsertSort(SqList&L) { inti=0,j=0,low=0,high=0,m=0; for(i=2;i<=L.length;i++) { L.elem[0]=L.elem[i]; low=1; high=i-1; while(low<=high) { m=(low+high)/2; if(L.elem[0]>L.elem[m]) low=m+1; else high=m-1; } for(j=i-1;j>=high+1;j--) L.elem[j+1]=L.elem[j]; L.elem[high+1]=L.elem[0]; print_data(L.elem,L.length); } } voidBubbleSort(SqList&L)//冒泡排序 { inti=0,j=0; for(i=L.length;i>=2;i--){ for(j=1;j { if(L.elem[j]>L.elem[j+1]) { print_data(L.elem,L.length); L.elem[0]=L.elem[j]; L.elem[j]=L.elem[j+1]; L.elem[j+1]=L.elem[0]; } } } } voidSelectSort(SqList&L)//简单选择排序 { intindex=0; for(inti=1;i<=L.length-1;i++) { index=i; for(intj=i+1;j<=L.length;j++){ if(L.elem[j] index=j; } if(i! =index) { print_data(L.elem,L.length); L.elem[0]=L.elem[i]; L.elem[i]=L.elem[index]; L.elem[index]=L.elem[0]; } } }//快排 intPartition(SqList&L,intlow,inthigh) {//将L.elem[low...high]一分为二 int pivot=0;//用子表第一个记录作枢轴 pivot=L.elem[low]; while(low { while(low high--; L.elem[0]=L.elem[low]; L.elem[low]=L.elem[high]; L.elem[high]=L.elem[0]; while(low low++; L.elem[0]=L.elem[low]; L.elem[low]=L.elem[high]; L.elem[high]=L.elem[0]; } returnlow; } voidQSort(SqList&L,intlow,inthigh) { //对顺序表L中的子序列L.elem[low...high]进行快速排序 intpivot=0; if(low { pivot=Partition(L,low,high); print_data(L.elem,L.length); QSort(L,low,pivot-1); QSort(L,pivot+1,high); } } voidQuickSort(SqList&L)//快速排序 { QSort(L,1,L.length); } voidprint_data(intdata[],intnum)//输出数据 { inti; intcount; printf("%d",num); printf("第%d次: ",number++); for(i=1;i<=num;i++) { printf("%5d",data[i]); count++; if(count%num==0) printf("\n"); } } /* voidprint1_data(intdata[],intnum)//输出数据 {//专门用于堆排序,数据从data[1]开始输出 inti; intcount; for(i=1;i<=num;i++) { printf("%5d",data[i]); count++; if(count%10==0) printf("\n"); } }*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课设 排序算法 数据结构 排序 算法