查找与排序操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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->keykey) p=p->lchild;

else

p=p->rchild;

}

if(!t) return s;

if (s->keykey) f->lchild=s;

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]);

}

相关文档
最新文档