查找与排序操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四查找与排序操作
一、实验目的
1.熟练掌握折半查找的查找方法;
2.熟练掌握二叉排序树的构造方法和查找算法;
3.熟练掌握各种排序的算法思想、方法及稳定性;
二、实验内容:
1.实现简单选择排序、直接插入排序和冒泡排序。
2.实现快速排序算法。
3.实现堆排序算法。
4.采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。
5.利用排序建立的有序表,采用折半查找实现某一已知的关键字的查找。
6.随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树,然后查找某一指定关键字元素。
三、实验说明:
(1)问题描述
利用一个整型数组存放待查找和排序的数据。
(2)数据描述
类型定义
int a[100]
四、注意问题
1.注意理解折半查找的适用条件(链表能否实现折半查找?)。
2.注意建立二叉排序树相同元素的处理。
3.比较各种查找算法的各自特点,能够根据实际情况选择合适的查找方法。
4.注意理解各种算法的思想、了解算法的适用情况及时间复杂度,能够根据实际情况选择合适的排序方法。
五、举例:
1:设计一个读入一串整数构成一棵二叉排序树的算法。
[实现提示]二叉排序树的构成,可从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中,所以它的主要操作是二叉排序树插入运算。在二叉排序树中插入新结点,只要保证插入后仍符合二叉排序树的定义即可。
[算法实现]
typedef struct node
{ int key;
struct node *lchild, *rchild;
} bstnode; /*类型定义*/
/*中序遍历*/
void inorder ( bstnode *t )
{ if (t)
{ inorder(t->lchild);
printf("%4d", t->key);
inorder(t->rchild);
}
}
/*将s结点插入到二叉排序树t中*/
bstnode *insertbst(bstnode *s,bstnode *t)
{ bstnode *f, *p;
p=t;
while(p)
{ f=p;
if (s->key==p->key) return t;
if (s->key
else
p=p->rchild;
}
if(!t) return s;
if (s->key
else
f->rchild=s;
return t;
}
bstnode *creatord( )
{ bstnode *t, * s;
int key;
t=0;
scanf("%d",&key);
while (key!=0)
{ s=(bstnode *)malloc(sizeof (bstnode));
s->key=key;
s->lchild=0;
s->rchild=0;
t=insertbst(t, s);
scanf("%d",&key);
}
return t;
}
main ( )
{ bstnode *root ;
root= creatord( );
inorder (root);
}
2:双向冒泡排序实验
(1)问题描述
试设计一个程序来修改冒泡排序过程以实现双向排序。冒泡排序是对每两个相邻的记录的关键字进行比较,双向冒泡程序是每一趟通过每两个相邻的关键字进行比较,产生最小和最大的元素,并放在其相应位置上。
(2)算法描述*/
void doublebubble(int r[],int n)
{ int i=1,j,b=1;
int t;
while (b)
{ b=0;
for (j=n-i;j>i-1;j--)
if (r[j] { b=1; t=r[j]; r[j]=r[j-1]; r[j-1]=t; } for (j=i;j if (r[j]>r[j+1]) { b=1; t=r[j]; r[j]=r[j+1]; r[j+1]=t; } i++; } } main() {int a[10]; int i; for(i=0;i<10;i++) scanf("%d",&a[i]); doublebubble(a,10); for(i=0;i<10;i++) printf("%d ",a[i]); }