数据结构实验五
{ p=f; return (ERROR);
} else if(key==T->data) { p=T; return (OK); } else if(key<T->data) SearchBST(T->lchild,key,T,p); else SearchBST(T->rchild,key,T,p); }
H.r[1] ←→ H.r[i];
//交换,要借用temp
HeapAdjust( H, 1,i-1 ); //从头重建最大堆, i-1=m
}
}
HeapAdjust(r, i, m ){
current=i; temp=r[i]; child=2*i;
while(child<=m){
//检查是否到达当前堆尾,未到尾则整理
/*二叉排序树中删除算法*/ int Delete(BiTree &p) { BiTree q,s;
if(!p->data) { q=p;
p=p->lchild;
//Delete() sub-function
free(q);
}
else if(!p->lchild)
{ q=p;
p=p->rchild;
/*一趟快速排序算法(针对一个子表的操作) */ int Partition(SqList &L,int low,int high){ //一趟快排 //交换子表 r[low…high]的记录,使支点(枢轴)记录到位,并返回其位置。返回时,在支点之前的记录均不 大于它,支点之后的记录均不小于它。 r[0]=r[low]; //以子表的首记录作为支点记录,放入r[0]单元 (续下页) pivotkey=r[low].key; //取支点的关键码存入pivotkey变量 while(low < high) //从表的两端交替地向中间扫描{ while(low<high && r[high].key>=pivotkey ) -high;
} //for } //SelectSort /*建堆算法 (即堆排序算法中的第一步) */ void HeapSort (HeapType &H ) {
//H是顺序表,含有H.r[ ]和H.length两个分量
for ( i = length / 2; i >0; - - i ) //把r[1…length]建成大根堆 HeapAdjust(r, i, length ); //使r[i…length]成为大根堆
实验五 查找与排序
实验课程名:数据结构(c 语言版)
专业班级: 学 号:
姓 名:
实验时间:
实验地点: 指导教师:
一、实验目的 1、进一步掌握指针变量、动态变量的含义。 2、掌握二叉树的结构特性,以及各种存储结构的特点和适用范围。 3、掌握用指针类型描述、访问和处理二叉树的运算
二、实验的内容和步骤
下面是查找与排序的部分基本操作实现的算法,请同学们自己设计主函数和部分算法,调用这些算法,完成下 面的实验任务。
if(s) return s%11;
/*输入数据的关键字函数*/ ElemType Inputkey() { ElemType x;
cout<<"请输入数据"<<endl;
cin>>x; return x;
}
/*输入一组关键字,建立Hash表,表长为m,用链地址法处理冲突*/
…… } // HeapSort
/*堆排序的算法实现 */
void HeapSort (HeapType &H )
{
//对顺序表H进行堆排序
for ( i = H.length / 2; i >0; - - i )
HeapAdjust(H,i, H.length ); //for,建立初始堆
for ( i = H.length; i > 1; - -i) {
{
ShellInsert(L,dlta[k]);
}
} // ShellSort
/* 希尔排序算法(其中某一趟的排序操作) */ void ShellInsert(SqList &L,int dk) { //对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子 for(i=dk+1;i<=L.length; ++ i)
typedef struct LNode { ElemType key;
struct LNode *next; }LNode,*LinkList;
typedef LNode * CHashTable [MAXSIZE] ; //链地址Hash表类型
/*求Hash函数*/ int H(int s)// {
/*二叉排序树中插入算法*/ int SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) //SearchBST() { if(!T)
{ p=f; return (ERROR);
} else if(key==T->data) { p=T; return (OK); } else if(key<T->data) SearchBST(T->lchild,key,T,p); else SearchBST(T->rchild,key,T,p); } //SearchBST() end
int Build_Hash (CHashTable & T, int m)
{ ElemType key;
LNode* q;
int n;
if(m<1) return ERROR;
for(int i=0; i<m; i++)
T[i]=NULL; //哈希表初始化
while( (key=Inputkey())!=0 ) //输入元素有效
/*整个快速排序的递归算法: */
void QSort ( SqList &L, int low, int high )
{
//对顺序表L中的子序列r[ low…high] 作快速排序
if ( low < high)
{ pivot = Partition ( L, low, high );
QSort ( L, low, pivot-1);
# define MAX_LENGTH 100 typedef int KeyType;
/* 顺序查找表的存储类型 */
typedef struct
//define structure SSTable
{ KeyType *elem;
int length;
}SSTable;
/* 在查找表中顺序查找其关键字等于 key 的数据元素。 */
//定义顺序表L的结构
RecordType r [ MAXSIZE +1 ]; //存储顺序表的向量
//r[0]一般作哨兵或缓冲区
int length ;
//顺序表的长度
}SqList ,L;
//例如L.r或L.length表示其中一个分量
//若r数组是表L中的一个分量且为node类型,则r中某元素的key分量表示为:r[i].key
/*直接插入排序算法的实现: */
void InsertSort ( SqList &L ) { //对顺序表L作直接插入排序
for ( i = 2; i <=L.length; ++ i ) //直接在原始无序表L中排序
if (L.r[i].key < L.r[i-1].key) //若L.r[i]较小则插入有序子表内
int Print_Hash (CHashTable & T)
{
LNode* q;
int n;
for(int i=0; i<11; i++)
{
q=T[i]; //哈希表初始化
while(q ) //输入元素有效
{
cout<<q->data<<"
";
q=q->next;
}
cout<<endl;
}
return OK;
{ q=(LNode*)malloc(sizeof(LNode));
q->data=key;
q->next=NULL;
n=H(key); //查HASH表得到指针数组的地址
q->next=T[n]; //原来的头指针后移
T[n]=q;
//新元素插入头部
} //while
return OK;
}
/*输出用链地址法处理冲突的Hash表*/
if(r[i].key < r[i-dk].key) { r[0]=r[i]; for(j=i-dk; j>0&&(r[0].key<r[j].key); j-=dk)
r[j+dk]=r[j];
r[j+dk]=r[0]; }//if } //ShellInsert //理解难点:不提前处理i子集后部元素,每次只考虑子集的前部(j=j-dk), //第二轮也只考虑i+1那个子集的前部。
}
/*定义每个记录(数据元素)的结构*/
Typedef struct {
//定义每个记录(数据元素)的结构
KeyType
key ;
//关键字
InfoType
otherinfo; //其它数据项
}RecordType,node ;
//例如node.key表示其中一个分量