查找和排序数据结构.docx
《查找和排序数据结构.docx》由会员分享,可在线阅读,更多相关《查找和排序数据结构.docx(12页珍藏版)》请在冰豆网上搜索。
![查找和排序数据结构.docx](https://file1.bdocx.com/fileroot1/2022-11/16/8ceecf56-18a8-45a0-9aa8-57699888022c/8ceecf56-18a8-45a0-9aa8-57699888022c1.gif)
查找和排序数据结构
数据结构实验报告
姓名:
否
学号:
班级:
计科1001
题目:
查找和排序
完成日期:
2012.6.8
成绩:
一,需求分析:
1:
程序分析
1)本程序主要完成了对一堆数字的查找和排序,其中查找只有一种方法,而排序有多种方法,主要是冒泡排序,快速插入排序,希尔排序,堆排序。
并且通过执行的次数可以判断其中的排序效率。
2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“菜单”,由用户根据自己的需求在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算提示以及信息输入显示在其后。
当你不想输入信息时,你可以按G结束该次操作,
2:
程序执行命令包括:
菜单
A:
冒泡排序
B:
折半查找
C:
直接排序
D:
希尔排序
E:
快速排序
F:
排序之前
G:
退出程序
3:
测试数据:
依次输入:
AFCFDFEFB
二概要设计:
1:
顺序存储结构的抽象数据类型定义为:
ADTList{
数据对象:
D={ai|ai∊ElemSet,i=1,2,...n,n>=0}
数据关系:
R1={|ai-1,aiD,i=1,2,...n}
基本操作:
maopao();
初始条件:
存在一个数据组,其顺序随意。
操作结果:
将所给的一组数据排序,并且输出其执行的次数。
insertsort()
初始条件:
存在一个数据组,其顺序随意。
操作结果:
将所给的一组数据排序,并且输出其执行的次数。
shellsort()
初始条件:
存在一个数据组,其顺序随意。
操作结果:
将所给的一组数据排序,并且输出其执行的次数。
qsort()
初始条件:
存在一个数据组,其顺序随意。
操作结果:
将所给的一组数据排序,并且输出其执行的次数。
output()
初始条件:
存在一个数据组,其顺序随意。
操作结果:
数超出排序前的顺序。
search_Bin()
初始条件:
存在一个数据组,其顺序随意。
操作结果:
折半查找某个特定元素。
}ADTSet
2.本程序包含二个大模块:
1)主程序模块:
voidmain(){
初始化;
do{
接受命令;
处理命令;
}while("命令"=“退出”);
}
2)输出模块
三,详细设计
#include
#include
#include
typedefstruct{
intkey;
intdata;
}SElemType;
typedefstruct{
SElemType*elem[21];
intlength;
}SSTable;
staticintsum=0;
//快速排序
intpartition(SSTable*L,intlow,inthigh)
{
intpivotkey;
L->elem[0]=L->elem[low];sum++;
pivotkey=L->elem[low]->data;
while(lowwhile((lowelem[high]->data>=pivotkey))
high--;
L->elem[low]=L->elem[high];sum++;
while((lowelem[low]->data<=pivotkey))
low++;
L->elem[high]=L->elem[low];
sum++;
}
L->elem[low]=L->elem[0];sum++;
returnlow;
}
voidqsort(SSTable*L,intlow,inthigh)
{
intpivotloc;
if(lowpivotloc=partition(L,low,high);
qsort(L,low,pivotloc-1);
qsort(L,pivotloc+1,high);
}
}
//希尔排序
voidshellinsert(SSTable*st,intdk)
{
inti,j;
for(i=dk+1;i<=st->length-1;++i)
if(st->elem[i]->dataelem[i-dk]->data)
{
st->elem[0]=st->elem[i];sum++;
for(j=i-dk;j>0&&st->elem[j]->data>st->elem[0]->data;j-=dk)
{st->elem[j+dk]=st->elem[j];sum++;}
st->elem[j+dk]=st->elem[0];sum++;
}
}
voidshellsort(SSTable*st,intdlta[],intt)
{
intk,j;
sum=0;
for(k=0;kshellinsert(st,dlta[k]);
printf("希尔排序的结果是:
\n");
for(j=1;jlength;j++)
printf("%d",st->elem[j]->data);
printf("\n希尔排序的次数是:
%d\n",sum);
printf("\n");
}
//直接排序
voidinsertsort(SSTablest)
{
inti,j;
sum=0;
for(i=2;i<=st.length-1;++i)
if(st.elem[i]->datadata)
{
st.elem[0]=st.elem[i];sum++;
for(j=i-1;st.elem[j]->data>st.elem[0]->data;--j)
{st.elem[j+1]=st.elem[j];sum++;}
st.elem[j+1]=st.elem[0];sum++;
}
printf("直接排序的结果是:
\n");
for(j=1;jprintf("%d",st.elem[j]->data);
printf("\n直接排序的次数是:
%d\n",sum);
}
//折半查找
intsearch_Bin(SSTablest,intk)
{
intlow,high,mid;
low=1;high=st.length;
while(low<=high){
mid=(low+high)/2;
if(st.elem[mid]->key==k)returnmid;
if(st.elem[mid]->key>k)high=mid-1;
elselow=mid+1;
}
return0;
}
//冒泡排序
voidmaopao(SSTablest)
{
inti=0,j=0;
sum=0;
for(j=1;jfor(i=1;iif(st.elem[i]->data>st.elem[i+1]->data)
{
inttemp;
temp=st.elem[i]->data;sum++;
st.elem[i]->data=st.elem[i+1]->data;sum++;
st.elem[i+1]->data=temp;sum++;
}
printf("冒泡排序的结果是:
\n");
for(j=1;jprintf("%d",st.elem[j]->data);
printf("\n冒泡排序的次数是:
%d\n",sum);
}
//输出函数
voidoutput(SSTablest)
{
intj;
printf("输出的结果是:
\n");
for(j=1;jprintf("%d",st.elem[j]->data);
printf("\n");
}
voidmain()
{
inti=0;
inttext[21]={0,11,4,55,72,38,64,87,22,9,97,99,10,15,49,86,48,19,56,14,59};
intT[3]={5,3,1};
charc;
SElemTypeS[21];
SSTableST;
SSTable*temp;
for(i=0;i<21;i++)
{//text.length()
S[i].key=i+1;
S[i].data=text[i];
ST.elem[i]=&S[i];
}
ST.length=21;
temp=&ST;
//text.length();
printf("菜单\n");
printf("A:
冒泡排序\n");
printf("B:
折半查找\n");
printf("C:
直接排序\n");
printf("D:
希尔排序\n");
printf("E:
快速排序\n");
printf("F:
排序之前\n");
printf("G:
退出程序\n");
do{
printf("请选择:
");
c=getchar();//scanf("%c",&c);
fflush(stdin);
for(i=0;i<21;i++)
{//text.length()
S[i].key=i+1;
S[i].data=text[i];
ST.elem[i]=&S[i];
}
temp=&ST;
switch(c)
{
case'A':
{
maopao(ST);
break;
}
case'B':
{
printf("折半查找的数据是:
%d\n",ST.elem[search_Bin(ST,ST.length)]->data);
break;
}
case'C':
{
insertsort(ST);
break;
}
case'D':
{
shellsort(temp,T,3);
break;
}
case'E':
{
intj;sum=0;
qsort(temp,1,ST.length-1);
printf("快速排序的结果是:
\n");
for(j=1;jprintf("%d",ST.elem[j]->data);
printf("\n快速排序的次数是:
%d\n",sum);
break;
}
case'F':
{
output(ST);
break;
}
}
}while(c!
='G');
}creatUDG(G)DFSTraverse(G)BFSTraverse(G)
}
函数的调用