查找排序应用实验Word文档下载推荐.docx
《查找排序应用实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《查找排序应用实验Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
![查找排序应用实验Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/28/3f5569a5-de39-4784-b26f-effd9168abaa/3f5569a5-de39-4784-b26f-effd9168abaa1.gif)
(特别要求:
使用菜单机制,在一个主程序下实现题目要求的排序和查找以及结果显示)
3实验步骤与源程序
#include<
stdio.h>
stdlib.h>
/*链式基数法排序声明*/
#defineRADIX10
#defineKEY_SIZE6
#defineLIST_SIZE20
#defineTRUE1
#defineFALSE0
typedefintKeyType;
typedefintOtherType;
typedefstruct
{
KeyTypekey[KEY_SIZE];
/*子关键字数组*/
OtherTypeother_data;
/*其它数据项*/
intnext;
/*静态链域*/
}RecordType1;
RecordType1r[LIST_SIZE+1];
/*r[0]为头结点*/
intlength;
intkeynum;
}SLinkList;
/*静态链表*/
typedefintPVector[RADIX];
typedefstruct
KeyTypekey;
}RecordType;
voidInsSort(RecordTyper[],intlength)
/*对记录数组r做直接插入排序,length为数组中待排序记录的数目*/
{
inti,j;
for(i=2;
i<
=length;
i++)
{
r[0]=r[i];
/*将待插入记录存放到监视哨r[0]中*/
j=i-1;
while(r[0].key<
r[j].key)/*寻找插入位置*/
{
r[j+1]=r[j];
j=j-1;
}
r[j+1]=r[0];
/*将待插入记录插入到已排序的序列中*/
}
}/*InsSort*/
//顺序查找
voidSeqSearch(RecordTyper[],intlength,KeyTypek)
inti;
r[0].key=k;
i=length;
while(r[i].key!
=k)i--;
printf("
该元素在数组中的位置是%d"
i);
}
//冒泡排序
voidBubbleSort(RecordTyper[],intlength)
/*对记录数组r做冒泡排序,length为数组的长度*/
intn,i,j;
intchange;
RecordTypex;
n=length;
change=TRUE;
for(i=1;
=n-1&
&
change;
++i)
change=FALSE;
for(j=1;
j<
=n-i;
++j)
if(r[j].key>
r[j+1].key)
{
x=r[j];
r[j]=r[j+1];
r[j+1]=x;
change=TRUE;
}
}/*BubbleSort*/
//快速排序
intQKPass(RecordTyper[],intleft,intright)
/*对记录数组r中的r[left]至r[right]部分进行一趟排序,并得到基准的位置,使得排序后的结果满足其之后(前)的记录的关键字均不小于(大于)于基准记录*/
intlow,high;
x=r[left];
/*选择基准记录*/
low=left;
high=right;
while(low<
high)
while(low<
high&
r[high].key>
=x.key)
/*high从右到左找小于x.key的记录*/
high--;
if(low<
high)
{
r[low]=r[high];
low++;
}
/*找到小于x.key的记录,则进行交换*/
high&
r[low].key<
x.key)/*low从左到右找大于x.key的记录*/
if(low<
r[high]=r[low];
}/*找到大于x.key的记录,则交换*/
r[low]=x;
/*将基准记录保存到low=high的位置*/
returnlow;
/*返回基准记录的位置*/
}/*QKPass*/
voidSelectSort(RecordTyper[],intlength)
/*对记录数组r做简单选择排序,length为数组的长度*/
inti,j,k,n;
for(i=1;
i<
=n-1;
++i)
k=i;
for(j=i+1;
j<
=n;
++j)
if(r[j].key<
r[k].key)k=j;
if(k!
=i)
{
x=r[i];
r[i]=r[k];
r[k]=x;
}
voidQKSort(RecordTyper[],intlow,inthigh)
/*对记录数组r[low..high]用快速排序算法进行排序*/
intpos;
if(low<
high)
pos=QKPass(r,low,high);
/*调用一趟快速排序,将枢轴元素为界划分两个子表*/
QKSort(r,low,pos-1);
/*对左部子表快速排序*/
QKSort(r,pos+1,high);
/*对右部子表快速排序*/
//堆排序
voidsift(RecordTyper[],intk,intm)
/*假设r[k..m]是以r[k]为根的完全二叉树,且分别以r[2k]和r[2k+1]为根的左、右子树为大根堆,调整r[k],使整个序列r[k..m]满足堆的性质*/
RecordTypet;
intx;
intfinished;
t=r[k];
/*暂存"
根"
记录r[k]*/
x=r[k].key;
i=k;
j=2*i;
finished=FALSE;
while(j<
=m&
!
finished)
if(j<
m&
r[j].key<
j=j+1;
/*若存在右子树,且右子树根的关键字大,则沿右分支"
筛选"
*/
if(x>
=r[j].key)
finished=TRUE;
/*筛选完毕*/
else
r[i]=r[j];
i=j;
j=2*i;
}/*继续筛选*/
r[i]=t;
/*r[k]填入到恰当的位置*/
}
voidcrt_heap(RecordTyper[],intlength)
/*对记录数组r建堆,length为数组的长度*/
inti,n;
n=length;
for(i=n/2;
i>
=1;
--i)/*自第[n/2]个记录开始进行筛选建堆*/
sift(r,i,n);
voidHeapSort(RecordTyper[],intlength)
/*对r[1..n]进行堆排序,执行本算法后,r中记录按关键字由大到小有序排列*/
RecordTypeb;
crt_heap(r,length);
n=length;
for(i=n;
i>
=2;
--i)
b=r[1];
/*将堆顶记录和堆中的最后一个记录互换*/
r[1]=r[i];
r[i]=b;
sift(r,1,i-1);
/*进行调整,使r[1..i-1]变成堆*/
}/*HeapSort*/
//链式基数排序
voidDistribute(RecordType1r[],inti,PVectorhead,PVectortail)
/*记录数组r中记录已按低位关键字key[i+1],…,key[d]进行过"
低位优先"
排序。
本算法按第i位关键字key[i]建立RADIX个队列,同一个队列中记录的key[i]相同。
head[j]和tail[j]分别指向各队列中第一个和最后一个记录(j=0,1,2,…,RADIX-1)。
head[j]=0表示相应队列为空队列*/
intj;
intp;
for(j=0;
=RADIX-1;
++j)
head[j]=0;
/*将RADIX个队列初始化为空队列*/
p=r[0].next;
/*p指向链表中的第一个记录*/
while(p!
=0)
j=r[p].key[i];
/*用记录中第i位关键字求相应队列号*/
if(head[j]==0)
head[j]=p;
/*将p所指向的结点加入第j个队列中*/
else
r[tail[j]].next=p;
tail[j]=p;
p=r[p].next;
}/*Distribute*/
voidCollect(RecordType1r[]