《数据结构》 内 排 序 算 法分析文档格式.docx
- 文档编号:22172629
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:30
- 大小:222.21KB
《数据结构》 内 排 序 算 法分析文档格式.docx
《《数据结构》 内 排 序 算 法分析文档格式.docx》由会员分享,可在线阅读,更多相关《《数据结构》 内 排 序 算 法分析文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
voidbubblesort(intb[],intn);
//冒泡排序
voidquicksort(intb[],intlow,inthigh);
//快速排序
voidMerge(inta[],intlow,intmid,inthigh,intb[]);
//归并排序
voidjishu(intb[],intn);
//基数排序
2、系统结构功能图
六、函数
1、头文件
3、a、"
h.h"
#include<
stdio.h>
time.h>
stdlib.h>
math.h>
string.h>
#defineN10000int
g_flag;
b、“head.h”
#defineMaxKeyNum12//最大关键字个数
#defineRadix10//关键字的基数
#defineMaxSize80//元素的个数
typedefintKeyType;
//关键字类型为int型
typedefstruct
{
charkey[MaxKeyNum];
intnext;
}SListCell;
//每个元素的关键字类型
SListCelldata[MaxSize];
intkeynum,len;
//关键字的个数及静态链表的长度
}SList;
//静态链表类型
typedefintaddr[Radix];
//定义静态指针数组类型
{KeyTypekey;
}DataType;
//元素类型*/
SListL;
DataTypea[MaxKeyNum];
2、主函数
#include"
fp.c"
mudex.c"
Rad
sort1.c"
voidmain()
{intg_flag;
intb[N],n;
charch;
ixsort.c"
g_flag=0;
n=reaData(b);
system("
modecon:
cols=170"
);
//调整屏幕显示大小列、行
while
(1)
{
switch(nume())
{
ch=getchar();
case1:
{
switch(insetr_mu())
case'
a'
:
insetsort(b,n);
printData(b,n);
system("
pause"
break;
b'
sheelsort(b,n);
//希尔排序//123
c'
binarysotr(b,n);
}
break;
case2:
switch(sele_mu())
i'
selectsort(b,n);
//简单选择排序//123
printData(b,n);
k'
heapsort(b,n);
//堆排序(完全二叉树)//123
case3:
switch(change_mu())
!
'
bubblesort(b,n);
y'
quicksort(b,0,n-1);
//快速排序
case4:
MergeSort(b,n);
//对数组中a元素进行归并排序
printData(b,n);
case5:
jishu(b,n);
printData(b,n);
break;
default:
printf("
error"
}
}
}
2、流程图
1.求最大值
3、载入数据
2.文件的有关操作
4.直接插入排序
5.希尔排序
6.折半插入
7.简单选择排序
8.堆调整
七、测试分析
白盒:
黑盒:
a.显示主菜单;
b.选择“1.插入类”;
C.选择¡
±
a.直接插入排序¡
;
结论:
正常。
b.选择“2.选择类”;
C.选择“k.直接插入排序”;
b.选择“3.交换”;
!
快速排序¡
b.选择“4.归并”;
b.选择“5.基数”;
八、使用说明
运行程序,在菜单界面,根据菜单的提示选择您想要实现的功能:
1:
插入类排序;
a:
直接插入类排序;
b:
折半排序;
c:
希尔排序;
2:
选择类排序;
i:
简单选择排序;
k:
堆排序;
3:
交换类排序;
:
快速排序;
y:
冒泡排序;
4:
归并类排序;
5:
基数排序。
九、课程设计总结
通过不断做课程设计,逐次有了一定的进步。
在这次课程设计中,又有了新的认识、理解,对于写程序,首先自己得先明确程序的目的,然后写一个大的框架,逐步向其添加实现自己想实现的功能的代码,对于每一行程序代码,要明白它是要实现哪一步,有什么功能,尽量的精简代码,让程序的效率提高。
当自己没有思路时,也可以去“继承”别人的代码,对于现成的代码,理解上就得严格把关,多次去想代码的运行,思路跟随代码,仔细的将代码大体化,进而细化,在这个过程中,调试是一个很好的方法,每一步的调试,都可以清楚的了解每一个变量随时变化的值,以便能彻底的了解程序。
实在是不能理解,就可以动手写,将程序代码的每一步执行运算后的结果写在纸上,通过不断的对比去加深对代码的理解与运用。
与此同时,也要和别人交流,讲出你的代码,在别人不断的疑问与你的解答中,你会收获颇多,真正的让你知道你的不足!
进而深层次的挖掘代码。
十、附录(各功能函数源代码)
1、文件的操作
intg_flag;
intreaData(intd[])
FILE*fp;
inti=0;
intch;
fp=fopen("
data.txt"
"
r"
if(NULL==fp)
return-1;
while(!
feof(fp))
fscanf(fp,"
%d"
&
ch);
d[i]=ch;
i++;
}}
g_flag=1;
fclose(fp);
returni;
}
intprintData(intd[],intn)
{inti=0;
if(g_flag<
1)
{printf("
请先载入数据文件。
\n"
return0;
for(;
i<
n;
i++)
%d\t"
d[i]);
if((i+1)%10==0)
return0;
1、菜单
intnume()
{intx;
printf("
\n\n"
system("
cls"
\t\t\t\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
\t\t\t\t\t\t┃排序简介图┃\n"
\t\t\t\t\t\t┃注:
由上而下!
┃\n"
\t\t\t\t\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"
\t\t\t\t\t\t┃┏━━━━━━━━━━┓┃\n"
\t\t\t\t\t\t┃*内排序算法*┃\n"
\t\t\t\t\t\t┃┏━━━━┓┗━━━━*┳*━━━━┛┏━━━┓┃\n"
\t\t\t\t\t\t┃┏*1插入类*═┏━━━━┓*╩*═┳*════┳*══*3交换*┓┃\n"
\t\t\t\t\t\t┃║┗┳****┳┛*2选择类*┗══┓┏┛┗┳*━*┛║┃\n"
\t\t\t\t\t\t┃║║║┗*═┳*┳┛┏******┓║║║║┃\n"
\t\t\t\t\t\t┃║║║║┗═*堆*║║║║┃\n"
\t\t\t\t\t\t┃║║║┏**╩***┓┗******┛║║┏*╩****┓║┃\n"
\t\t\t\t\t\t┃║║┏**╩***┓*简单*║║*快速*║┃\n"
\t\t\t\t\t\t┃║║*希尔*┗*******┛║║┗*****═┛║┃\n"
\t\t\t\t\t\t┃║║┗*******┛║║║┃\n"
\t\t\t\t\t\t┃║║║║┏*******┓║┃\n"
\t\t\t\t\t\t┃║║┏*******┓┏═════┛┗┓*冒泡*┛┃\n"
\t\t\t\t\t\t┃║┗*直接*┏━┛━━┓║┗*******┛┃\n"
\t\t\t\t\t\t┃║┗*******┛*4归并*║┃\n"
\t\t\t\t\t\t┃┏╩****┓┗***═**━┛┏━━━╩┓┃\n"
\t\t\t\t\t\t┃*折半**5基数*┃\n"
\t\t\t\t\t\t┃┗******┛┗════┛┃\n"
\t\t\t\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
\n\n\n\n"
输入你想要的排序方法:
"
scanf("
&
x);
if(x<
0&
&
x>
6)
printf("
输入有误!
请重新输入(1~5)"
scanf("
returnx;
charinsetr_mu()
charx;
\t\t\t\t\t\t┏━━━━━━━━━━━━━━━━━━┓\n"
\t\t\t\t\t\t┃━━━━━插入类排序━━━━━━━━┃\n"
\t\t\t\t\t\t┃┃\n"
\t\t\t\t\t\t┃a.直接插入排序┃\n"
\t\t\t\t\t\t┃b.折半排序┃\n"
\t\t\t\t\t\t┃c.希尔排序┃\n"
\t\t\t\t\t\t┗━━━━━━━━━━━━━━━━━━┛\n"
输入你想要的插入类排序方法:
%s"
if(x!
='
&
x!
)
请重新输入!
或!
%c"
charsele_mu()
{charx;
\t\t\t\t\t\t┏━━━━━━━━━━━━━━━━┓\n"
\t\t\t\t\t\t┃━━━━选择类排序类排序━━━━┃\n"
\t\t\t\t\t\t┃i.简单选择排序┃\n"
\t\t\t\t\t\t┃k.堆排序┃\n"
\t\t\t\t\t\t┗━━━━━━━━━━━━━━━━┛\n"
输入你想要的选择类排序方法:
请重新输入i或k"
}charchange_mu()
\t\t\t\t\t\t┃━━━━━交换排序类排序━━━┃\n"
\t\t\t\t\t\t┃!
.快速排序┃\n"
\t\t\t\t\t\t┃y.冒泡排序┃\n"
输入你想要的交换类排序方法:
或y"
3、排序
/************插入类排序******************/
voidinsetsort(intb[],intn)//直接插入排序
{inti,j,t;
for(i=1;
i<
i++)
t=b[i];
for(j=i;
j>
0&
t<
b[j-1];
j--)
{b[j]=b[j-1];
b[j]=t;
}}
voidsheelsort(intb[],intn)//希尔排序
{inti,j,delta,t;
for(delta=n/2;
delta>
=1;
delta/=2)
{for(i=delta;
{t=b[i];
j=i-delta;
while(j>
=0&
b[j]>
t){
b[j+delta]=b[j];
j-=delta;
}b[j+delta]=t;
}}}
voidbinarysotr(intb[],intn)//折半插入排序
{intlow,high,mid,i,j,t;
{low=0;
high=i-1;
while(low<
=high)
{mid=(low+high)/2;
if(t<
b[mid])
high=mid-1;
low;
b[j]=b[j-1];
b[low]=t;
}}/************选择类排序******************/
voidselectsort(intb[],intn)//简单选择排序
{inti,j,k,t;
for(i=0;
k=i;
//i被认为当前趟最小的元素的下标
for(j=i+1;
j<
j++)
{if(b[k]>
b[j])
k=j;
//找出当前趟最小元素下标记为k}
if(k!
=i){
//当认为的和实际找到的最小元素的下标不等时,则交换
b[i]=b[k];
b[k]=t;
voidadjustheap(intb[],ints,intn)//从编号s开始调整{
inti,j,t,flag;
i=s;
j=2*i+1;
flag=0;
while(j<
n&
!
flag)
{if(j<
n-1&
b[j]<
b[j+1])//查找孩子结点的最大值
j++;
if(t>
b[j])//如果根结点元素值大于孩子结点
flag=1;
else
{//逐层调整元素的位置
b[i]=b[j];
i=j;
b[i]=t;
//将根结点存放到相应的位置
}voidheapsort(intb[],intn)//堆排序(完全二叉树)
inti,t;
for(i=n/2-1;
i>
=0;
i--)//从n/2开始建立堆
adjustheap(b,i,n);
for(i=n-1;
0;
t=b[0];
b[0]=b[i];
adjustheap(b,0,i);
//从根结点开始调整}}/************交换类排序******************/
voidbubblesort(intb[],intn)//冒泡排序
for(j=0;
n-i-1;
{if(b[j]>
b[j+1])
{t=b[j];
b[j]=b[j+1];
b[j+1]=t;
printf("
第%d趟排序结果:
i+1);
{if((j+1)%50==0)
%4d\t"
b[j]);
voidquicksort(intb[],intlow,inthigh)//快速排序
{inti,j,pivot;
i=low;
j=high;
pivot=b[low];
while(i<
j)
{while(i<
j&
pivot<
=b[j])
j--;
if(i<
{b[i]=b[j];
i++;
b[i]<
pivot)
{b[j]=b[i];
b[i]=pivot;
if(low<
i)
quicksort(b,low,i-1);
high)
quicksort(b,j+1,high);
}/*归并排序*/
voidMerge(inta[],intlow,intmid,inthigh,intb[])
{inti,j,k;
j=mid+1;
k=low;
=mid&
j<
{if(a[i]<
=a[j])
{b[k]=a[i];
else{
b[k]=a[j];
k++;
=mid)
{b[k++]=a[i++];
{b[k++]=a[j++];
voidMSort(inta[],intlow,inthigh,intc[])
{c[low..high]中
intb[N],mid;
if(low==high)
c[low]=a[low];
else
MSort(a,low,mid,b);
//递归的将a[low..high]归并为有序的b[low...high]
MSort(a,mid+1,high,b);
Merge(b,low,mid,high,c);
//将a[low...mid]和c[mid...high]归并到c[low...high]}}
voidMergeSort(inta[],intn)//对数组中a元素进行归并排序
{MSort(a,0,n-1,a);
head.h"
/*基数排序*/
oidInitList(SList*L,DataTypea[],intn)//利用数组a的元
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 数据结构 法分析 分析