数据结构课设 排序算法文档格式.docx
- 文档编号:18841645
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:112.86KB
数据结构课设 排序算法文档格式.docx
《数据结构课设 排序算法文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课设 排序算法文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
并显示交换次数和比较次数和排序的方式包含教材中所介绍的几种常用的排序方式:
直接、折半插入排序、冒泡排序、快速排序、选择排序。
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)移动次数:
d)最坏情况(逆序)
e)比较次数:
(需n-1趟,每趟达到最大比较次数)
f)移动次数:
在最坏情况下,时间复杂度为:
T(n)=O(n²
)
2.空间复杂度:
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<
stdio.h>
stdlib.h>
math.h>
time.h>
typedefstructSqList//顺序表存储结构
{
int*elem;
intlength;
}SqList;
voidInsertSort(SqList&
L);
//直接插入排序
voidBInsertSort(SqList&
//折半插入排序
voidBubbleSort(SqList&
//冒泡排序
voidSelectSort(SqList&
//简单选择排序
voidQuickSort(SqList&
//快速排序
voidQSort(SqList&
L,intlow,inthigh);
intPartition(SqList&
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)//动态分配顺序表存储空间
}
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];
%7d"
L.elem[i]);
system("
PAUSE"
}
voidrecover(){
L.elem[i]=temp.elem[i];
intmain(void)
{
intn;
intchange=0;
printf("
请输入顺序表的长度:
"
scanf("
%d"
&
n);
input(n);
while
(1){
number=1;
system("
CLS"
recover();
\t\t------选择排序算法:
--------\n"
\t\t\t1直接插入排序\n"
\t\t\t2折半插入排序\n"
\t\t\t3冒泡排序\n"
\t\t\t4简单选择排序\n"
\t\t\t5快速排序\n"
\t\t\t8退出\n"
\t\t\t请输入你的选择:
scanf("
change);
switch(change)
{
case1:
InsertSort(L);
break;
case2:
BInsertSort(L);
case3:
BubbleSort(L);
case4:
SelectSort(L);
case5:
QuickSort(L);
case8:
exit(0);
default:
}
排序后为:
for(inti=1;
i++)
printf("
%6d"
\n"
return0;
L)//直接插入排序
inti=0,j=0,n=0;
for(i=1;
i++){
if(L.elem[i]<
L.elem[i-1])
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];
}
L)
inti=0,j=0,low=0,high=0,m=0;
for(i=2;
{
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;
L.elem[j+1]=L.elem[j];
L.elem[high+1]=L.elem[0];
print_data(L.elem,L.length);
L)//冒泡排序
inti=0,j=0;
for(i=L.length;
i>
=2;
i--){
for(j=1;
j<
i;
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];
}
L)//简单选择排序
intindex=0;
=L.length-1;
index=i;
for(intj=i+1;
j++){
if(L.elem[j]<
L.elem[index])
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];
}//快排
L,intlow,inthigh)
{//将L.elem[low...high]一分为二
int
pivot=0;
//用子表第一个记录作枢轴
pivot=L.elem[low];
while(low<
high)
high&
&
L.elem[high]>
=pivot)
high--;
L.elem[0]=L.elem[low];
L.elem[low]=L.elem[high];
L.elem[high]=L.elem[0];
L.elem[high]<
low++;
returnlow;
//对顺序表L中的子序列L.elem[low...high]进行快速排序
intpivot=0;
if(low<
pivot=Partition(L,low,high);
QSort(L,low,pivot-1);
QSort(L,pivot+1,high);
L)//快速排序
QSort(L,1,L.length);
voidprint_data(intdata[],intnum)//输出数据
inti;
intcount;
num);
第%d次:
number++);
=num;
i++)
%5d"
data[i]);
count++;
if(count%num==0)
/*
voidprint1_data(intdata[],intnum)//输出数据
{//专门用于堆排序,数据从data[1]开始输出
inti;
intcount;
for(i=1;
printf("
count++;
if(count%10==0)
}*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课设 排序算法 数据结构 排序 算法