数据结构查找算法课程设计

数据结构查找算法课程设计
数据结构查找算法课程设计

存档编号:

西安********

课程设计说明书

设计题目:

查找算法性能分析

系别:计算机学院

专业:计算机科学

班级:计科***

姓名:王***

(共页)

2015年01月07 日

*****

计算机科学专业课程设计任务书

姓名:*** 班级:计科**** 学号:****

指导教师:**** 发题日期:2015-01-05

完成日期:2015-01-09

一需求分析

1.1问题描述

查找又称检索,是指在某种数据结构中找出满足给定条件的元素。查找是一种十分有用的操作。而查找也有内外之分,若整个查找过程只在内存中进行称为内查找;若查找过程中需要访问外存,则称为外查找,若在查找的同时对表做修改运算(插入或删除),则相应的表成为动态查找表,反之称为静态查找表。

由于查找运算的主要运算是关键字的比较,所以通常把查找过程中对关键字的平均比较次数(也叫平均查找长度)作为一个查找算法效率优劣的标准。

平均查找程度ASL定义为:

ASL=∑PiCi(i从1到n)

其中Pi代表查找第i个元素的概率,一般认为每个元素的查找概率相等,Ci代表找到第i个元素所需要比较的次数。

查找算法有顺序查找、折半查找、索引查找、二叉树查找和散列查找(又叫哈希查找),它们的性能各有千秋,对数据的存储结构要求也不同,譬如在顺序查找中对表的结果没有严格的要求,无论用顺序表或链式表存储元素都可以查找成功;折半查找要求则是需要顺序表;索引表则需要建立索引表;动态查找需要的树表查找则需要建立建立相应的二叉树链表;哈希查找相应的需要建立一个哈希表。

1.2基本要求

(1)输入的形式和输入值的范围;

在设计查找算法性能分析的过程中,我们调用产生随机数函数:

srand((int)time(0));

产生N个随机数。

注:折半查找中需要对产生的随机数进行排序,需要进行排序后再进行输入,N<50; (2)输出形式;

查找算法分析过程中,只要对查找算法稍作修改就可以利用平均查找

长度的公式:

ASL=∑PiCi(i从1到n)

输出各种查找算法的平均查找长度。

注:平均查找长度=总的平均查找长度/N;

(3)程序所能达到的功能

通过输出几种查找算法的ASL,我们很显然能得在数据量较小时(N<100)我们在实现静态查找时应该选择如何调用哪种查找算法。

二概要设计

说明本程序中用到的所有抽象数据类型的定义。主程序的流程以及各程序模块之间的层次(调用)关系。

1、数据结构

顺序查找:在进行顺序查找顺序表类型定时需要定义typedef int KeyType;

顺序表类型为SeqList类型。typedef NodeType SeqList【MaxSize】;/ 它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,查找成功。

折半查找:在进行顺序查找顺序表类型定时需要定义typedef int KeyType,并且需要调用排序函数对其进行排序。

折半查找类型为SeqList类型。typedef NodeType SeqList【MaxSize】;

折半查找又叫二分查找,效率较高,但折半查找要求被查找的表示顺序表,它的基本思路是:设R【low…..high】是当前的查找区间,首先确定该区间的中点位置mid=┖(low+high)/2 ┘,然后将待查的k值与R【mid】.key。

①如果中点值的值是k,返回该元素的逻辑符号;

②如果中点值>k,则中点值之后的数都大于k,所以k值在该表的左边,

所以确定一个新的查找区间;

③如果中点值

该表的右边确定一个新的查找区间;

④依次循环。

索引查找:/索引存储结构是在存储数据的同时还建立附加的索引表,索引表包括关键字和地址。索引表的数据类型KeyType key、int link,link代表对应块的起始下标。

typedef IdxType IDX[MaxSize] //索引表的类型

分块查找又称索引顺序查找,它的性能介于顺序查找和折半查找之间的一种算法,它的分块的思想是:

①将表均分成b块,前b-1块中的关键字个数为s=┏n/b┐;

②每一块的关键字不一定有序,但前一块中的最大关键字必须小于后一块

中的最小关键字;

③取各块中最大的关键字及该块在R中的起始位置。

注:索引表是一个递增有序表

分块查找的基本思路是:

①首先查找索引表,因为索引表是有序表,所以可以采用折半查找或者

顺序查找,来确定待查元素在哪一块;

②再已确定的块中进行顺序查找(因为块内元素无序,所以只能用顺序

查找)

列:设有一个线性表采用顺序存储,有20个元素,将其分成4(b=4)部分,每部分有5个元素(s=5),该索引表的存储结构如下图所示:

在如图所示的存储结构中,查找关键字k=80时,首先将k和索引表中个关键字比较,直到找到大于等于k的值,因此若关键字k=80存在则必定在第四块中,由IDX[3].link找到起始地址15,从该地址开始在R【15…19】中进行查找,直到找到关R【8】.key=k为止,如果查找不成功说明不存在关键字k=80。

二叉树查找:

线性表可以有三种查找法,其中折半查找的效率最高,但是折半查找要求元素时顺序表,而且不能用链式存储结构,因此有表的插入或删除操作时,需要移动大量元素,这时候二叉树查找的优势就体现出来了。即动态查找时就需要用到链式存储结构。

二叉排序树(BST)又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:

①若它的左孩子非空,则左子树上的所有元素的值均小于根元素的值;

②若它的右孩子非空,则左子树上的所有元素的值均大于根元素的值;

③左右子树本身是一颗二叉树。

重要性质:中序遍历二叉排序树所得到中序序列是以一个递增有序序列。

二叉排序树算法思想:它可以看做是一个有序表,所以在二叉树上查找,和折半查找类似,也是一个逐步缩小查找范围的过程,运用递归查找算法SearchBST()。哈希表查找:

在用哈希表查找时先建立一个哈希表,哈希表主要用于快速查找,哈希表的查找过程和建表过程类似。

它的算法是:

①设给定的值为k,根据建表时设定的散列函数h(k)计算哈希地址;

②存储的个数为n,设置一个长度为M(M>n)的连续内存单元,以线性表中

的每个对象Ki为自变量,通过h(k)把Ki映射为内存单元的地址,并把

该对象存储字这个内存单元中。

哈希函数的构造有直接定址法、除留余数法和数字分析法,常用的是除留余数法,它是用关键字k除以某个不大于哈希表长度m的数p,将所得到的余数作为哈希地址。除留余数法的哈希函数h(k):

H(k)=K mod P(mod为取余运算,p<=m)

2、程序模块

顺序查找:

int SeqSearch(SeqList R,int n,KeyType k) /*函数的返回值是整型,有三个参数分别是顺序表SeqList、元素个数n和需要查找的关键字k*/

{

int i=0;

while (i

i++;

if(i>=n) /*未找到返回0/*

return 0;

else

return i+1; /*找到时返回逻辑符号i+1*/

}

折半查找:

int BinSearch(SeqList R,int n,KeyType k)/*函数的返回值是整型,有三个参数分别是顺序表SeqList、元素个数n和需要查找的关键字*/

{

int low=0,high=n-1,mid;

int count=0;

while(low<=high) /*当前区域存在元素时循环*/

{

count++; /*每循环一次count++*/

mid=(low+high)/2;

if(R[mid].key==k) /*如果查找成功返回其逻辑序号mid+1*/

return mid+1;

if(R[mid].key>k) /*继续在R【low…mid-1】中查找*/

high=mid-1;

else /* 继续在R【mid+1…high】中查找*/

return count+1; /*返回的是总的平均查找长度*/

}

}

索引查找:

int IdxSearch(IDX I,int b,SeqList R,int n,KeyType k) /*索引查找函数值返回的是整型,函数有五个参数,分别是索引表I、分的块数b、顺序表R、关键字个数和关键字*/

{

int low=0,high=b-1,mid,i,count=0;

int s=n/b; /*s为每块的元素个数,应为n/b的向上取整*/

while(low<=high) /*索引表中进行折半查找、找到的位置为high+1*/

{

count++;

mid=(low+high)/2;

if(I[mid].key>=k)

high=mid-1;

else

low=mid+1;

}

/* 应在索引表的high+1中,再在对应的线性表中进行顺序查找*/

i=I[high+1].link;

while(i<=I[high+1].link+s-1&&R[i].key!=k)

if(i<=I[high+1].link+s-1) /* 查找成功*/

{

i++;

count++;

}

return count+1;

}

int SearchBST(BSTNode *bt,KeyType k) /*二叉排序树查找函数的返回值是BSTNode类型,函数有两个参数分别是二叉排序树bt和关键字k*/

{ if(bt==NULL||bt->key==k) /*递归的终结条件*/

return 1;

if(k < bt->key)

{ return SearchBST(bt->lchild ,k) + 1; /*在左子树中的递归查找*/ }

else

{ return SearchBST(bt->rchild ,k) + 1; /*在右子树中的递归查找*/ }}

int SearchHT(HashTable ha,int p,KeyType k) /*哈希查找的返回值是整型有三个参数,分别是哈希表ha、小于哈希表长度的最小素数p和关键字k*/

{

int i=0,adr=0;

int m=50;

adr =k%p;

while (ha[adr].key!=NULLKEY && ha[adr].key!=k) /*采用线性探查法查找下一个地址*/

{

i++;

adr =(adr+1)%m; /*adr=(adr+1)mod m*/

}

if(ha[adr].key==k)

return i+1; /*查找成功*/

else

return -1; /*查找失败*/

}

3、各模块之间的调用关系以及算法设计

函数的调用关系图:

在主函数中需要定义一个SeqList R的顺序表;HashTable ha 哈希表;索引表IDX I。用srand函数(产生随机数)随机产生50个1到100的整数并输出,因为折半查找需要的是顺序表,所以再对产生的50个随机数再进行排序。调用SeqSearch、BinSearch、IdxSearch、SearchHT、SearchBST(CreateBST)。依次进行输出。

注意:每次都要给sum重新赋值为零。

三详细设计

#include

#include

#include

#define MAXL 100

#define MAXI 100

#define NULLKEY -1

#define DELKEY -2

typedef int KeyType;

typedef int InfoType;

typedef struct

{

KeyType key;

.

int link;

}IdxType;

typedef IdxType IDX[MAXI];

typedef struct

{

KeyType key;

InfoType data;

}NodeType;

typedef NodeType SeqList[MAXL];

typedef struct node

{

KeyType key;

InfoType data;

struct node *lchild,*rchild;

}BSTNode;

typedef struct

{ KeyType key;

InfoType data;

int count;

}HashTable[MAXL];

int SeqSearch(SeqList R,int n,KeyType k) //顺序查找

{ int i=0;

while(i

{ i++;

}

return i+1;

}

int BinSearch(SeqList R,int n,KeyType k) //折半查找{

int low=0,high=n-1,mid,count=0;

while(low<=high)

{

count++;

mid=(low+high)/2;

if(R[mid].key==k)

return count+1;

if(R[mid].key>k)

high=mid-1;

else

low=mid+1;

}

return 0;

}

int IdxSearch(IDX I,int b,SeqList R,int n,KeyType k) //索引查找{

int low=0,high=b-1,mid,i;

int count=0;

int s=n/b;

while(low<=high)

{

count++;

mid=(low+high)/2;

if(I[mid].key>=k)

high=mid-1;

else

low=mid+1;

}

i=I[high+1].link;

while(i<=I[high+1].link+s-1&&R[i].key!=k)

{

count++;

i++;

}

if(i<=I[high+1].link+s-1)

return count+1;

else

return 0;

}

int SearchHT(HashTable ha,int p,KeyType k) //散列查找{

int i=0,adr=0;

int m=50;

adr =k%p;

while (ha[adr].key!=NULLKEY && ha[adr].key!=k)

{

i++;

adr =(adr+1)%m;

}

if(ha[adr].key==k)

return i+1;

else

return -1;

}

void InsertHT(HashTable ha,int &n,KeyType k,int p) //哈希表的插入{

int i,adr;

adr=k%p;

if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)

{

ha[adr].key=k;

ha[adr].count=1;

}

else

{

i=1;

do

{

adr=(adr+1)%p;

i++;

}while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY);

ha[adr].key=k;

ha[adr].count=i;

}

n++;

}

void CreateHT(HashTable ha,KeyType x[],int n,int m,int p) //哈希表的创建{

int i,n1=0;

for(i=0;i

{

ha[i].key=NULLKEY;

ha[i].count=0;

}

for(i=0;i

InsertHT(ha,n1,x[i],p);

}

int InsertBST(BSTNode * &p,KeyType k) //二叉排序树的插入

{

if(p==NULL)

{

p=(BSTNode *)malloc(sizeof(BSTNode));

p->key=k;

p->lchild=p->rchild=NULL;

.

return 1;

}

else if(k==p->key)

return 0;

else if(kkey)

return InsertBST(p->lchild,k);

else

return InsertBST(p->rchild,k);

}

BSTNode *CreateBST(KeyType a[],int n) //二叉排序树的创建

{

BSTNode *bt=NULL;

int i=0;

while (i

{

InsertBST(bt,a[i]);

i++;

}

return bt;

}

int SearchBST(BSTNode *bt,KeyType k) //二叉排序树查找

{

if(bt==NULL||bt->key==k)

return 1;

if(k < bt->key)

{

return SearchBST(bt->lchild ,k) + 1;

}

else

{

return SearchBST(bt->rchild ,k) + 1;

}

}

void main()

{

SeqList R;int i;int e;int a;int b;

HashTable ha;

int T[50];

IDX I;

double j,k,m,n,sum=0;

srand((int)time(0));

for(i=0;i<50;i++)

{

R[i].key=1+(int)(50.0*rand()/(RAND_MAX+1.0));

printf("%d\t",R[i].key);

}

printf("**************************************************************

*************\n");

for(i=0;i<50;i++)

for(a=i+1;a<50;a++)

if(R[i].key>R[a].key)

{

e=R[i].key;

R[i].key=R[a].key;

R[a].key=e;

}

for(i=0;i<50;i++)

T[i]=R[i].key;

for(i=0;i<50;i++)

{

sum=sum+SeqSearch(R,50,R[i].key);

}

printf("顺序查找平均查找长度:%6.2f\n",sum/50.0);

sum=0;

for(i=0;i<50;i++)

{

sum=sum+BinSearch(R,50,R[i].key);

}

printf("折半查找平均查找长度:%6.2f\n",sum/50.0);

sum=0;

for(i=0;i<5;i++)

{

I[i].link=i*10;

I[i].key=R[i*10+9].key;

}

for(i=0;i<50;i++)

{

sum=sum+IdxSearch(I,5,R,50,R[i].key);

}

printf("索引查找平均查找长度:%6.2f\n",sum/50.0);

sum=0;

CreateHT(ha,b,50,53,53);

for(i=0;i<50;i++)

{

sum=sum+SearchHT(ha,53,ha[i].key);

}

printf("哈希表查找平均查找长度:%6.2f\n",sum/50.0);

sum=0;

for(i=0;i<50;i++)

{

sum=sum+SearchBST(CreateBST(b,50),b[i]);;

}

printf("二叉树查找平均查找长度:%6.2f\n",sum/50.0); }

数据结构实验——查找算法的实现

实验五 查找算法实现

1、实验目的 熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。 2、问题描述 查找表是数据处理的重要操作,试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树,并比较两者的平均查找长度。 3、基本要求 (1)以链表作为存储结构,实现二叉排序树的建立、查找和删除。 (2)根据给定的数据建立平衡二叉树。 4、测试数据 随即生成 5、源程序 #include<> #include<> #include<> #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)>(b)) typedef int Keytype; typedef struct { Keytype key; //关键字域 }ElemType; typedef struct BSTnode { ElemType data; int bf; struct BSTnode *lchild,*rchild; }BSTnode,*BSTree; void InitBSTree(BSTree &T) {T=NULL; } void R_Rotate(BSTree &p) {BSTnode *lc; lc=p->lchild; p->lchild=lc->rchild; lc->rchild=p; p=lc; } void L_Rotate(BSTree &p) {BSTnode *rc; rc=p->rchild; p->rchild=rc->lchild;

数据结构实验总结报告

数据结构实验总结报告 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,

会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。 (3)程序界面更加人性化。 Huffman Tree Demo (C) 2011-12-16 boj Usage: huffman [-c file] [-u file] output_file -c Compress file. e.g. huffman -c test.txt test.huff -u Uncompress file. e.g. huffman -u test.huff test.txt 目前的程序提示如上所示。如果要求实用性,可以考虑加入其他人性化的功能。 三、调研常用的压缩算法,对这些算法进行比较分析 (一)无损压缩算法 ①RLE RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。 变体1:重复次数+字符 文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

摘要 本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步 该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。 关键词:黑白棋;编程;设计

二叉排序树 折半查找 顺序查找 数据结构

二叉排序树 #include "c1.h" #include "stdio.h" #include "stdlib.h" typedef int KeyType; typedef struct node{ KeyType key; struct node *lchild,*rchild; }BiTNode,*BiTree; void InsertBST(BiTree &bst,KeyType key) { BiTNode *t; if(bst==NULL) { t=(BiTree)malloc(sizeof(BiTNode)); t->key=key; t->lchild=NULL; t->rchild=NULL; bst=t; } else if(keykey) InsertBST(bst->lchild,key); else if(key>bst->key) InsertBST(bst->rchild,key); } void CreateBST(BiTree &bst) { int i; int n; KeyType key=0; bst=NULL; printf("请输入二叉排序树中元素的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入二叉排序数中的第%d个元素:",i); scanf("%d",&key); InsertBST(bst,key); }

} BiTree SearchBST(BiTree bst,KeyType key) { if(!bst) return NULL; else if(bst->key==key) return bst; else if(keykey) return SearchBST(bst->lchild,key); else return SearchBST(bst->rchild,key); } int main() { BiTree bst; CreateBST(bst); KeyType temp; printf("请输入你要查找的元素:"); scanf("%d",&temp); BiTree T; T=SearchBST(bst,temp); if(T==NULL) printf("\n\n查找失败\n"); else { printf("\n\n查找成功\n"); printf("二叉排序树中查到的元素为:%d\n",T->key); } } 折半查找和顺序查找 #include "stdio.h" #include "stdlib.h" #include "c1.h" #define N 20

数据结构课程设计题目选择

数据结构课程设计题目 说明: (1)选用语言:C或Java语言; (2)需要注明3人(可少于3人)小组各自承担和完成的任务(据此给予成绩); (3)如下带“*”的题目,“*”越多,难度越大一些,分值权重更高---要得到更高分数,推荐选择。 要求: (1) 用中文给出设计说明书(含重要子函数的流程图); (2) 给出测试通过、能实现相应功能的源代码; (3) 测试报告。 0、小学数学四则混合运算试题出题、评价、题库自动生成与组卷系统(****)---已经有2组选择 任务: (1)将随机给出的四则混合运算表达式显示在计算机显示器上,要求应试者给出答案;并且使用堆栈对该表达式求值,同给出的答案进行比较,判断 正确和错误。给出鼓励信息和嘉奖信息; (2)保存多人在不同时间应试的题目与他(或她)给出的答案,评价所出题目的难易程度(通过多人回答正确与否的情况给出),形成题库; (3)按照用户给出的题目难易程度指标(例如让50人的得分满足怎样的正态分布,如90分以上10%,80分以上30%,70分以上30%,60分以上20%,60分 以下10%),从题库中抽取不同的题目,组成试卷。 要求:随机产生的题目中,参加运算的数据随机、运算符随机。题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。 1、集合的并、交和差运算---已经有1组选择 任务:编制一个能演示执行集合的并、交和差运算的程序。 要求: (1) 集合的元素限定为小写字母字符[…a?..?z?] 。 (2) 演示程序以用户和计算机的对话方式执行。 实现提示:以链表表示集合。 选作内容: (1) 集合的元素判定和子集判定运算。 (2) 求集合的补集。 (3) 集合的混合运算表达式求值。 (4) 集合的元素类型推广到其他类型,甚至任意类型。 2、停车场管理------已经有2组选择 任务:设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 要求:以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。 3、哈夫曼码的编/译码系统(**)---已经有1组选择

数据结构课程设计(附代码)-数据结构设计说明

应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计容说明 1. 项目一 (1) 对设计任务容的概述 学生成绩管理** 任务:要现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面 (3) 程序流程图

(4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。 2、输入功能:LinkList *create(); 通过一个for循环语句的控制,可以一次完成无数条记录的输入。并将其存入链

数据结构 第九章 查找 作业及答案

第九章查找 一、填空题 1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是。 2. 线性有序表(a 1,a 2 ,a 3 ,…,a 256 )是从小到大排列的,对一个给定的值k,用二分法检索 表中与k相等的元素,在查找不成功的情况下,最多需要检索次。设有100个结点,用二分法查找时,最大比较次数是。 3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两 次查找成功的结点数为 2 ;比较四次查找成功的结点数为 ,其下标从小到大依次是 ____,平均查找长度为。 4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素比较大小。 5. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。 6. 散列法存储的基本思想是由决定数据的存储地址。 7. 有一个表长为m的散列表,初始状态为空,现将n(n

数据结构课程设计题目及要求

实验一~实验四任选一题;实验五~实验九任选一题。 实验一运动会分数统计 一、实验目的: (1)熟练掌握线性表的两种存储方式 (2)掌握链表的操作和应用。 (3)掌握指针、结构体的应用 (4)按照不同的学校,不同项目和不同的名次要求,产生各学校的成绩单、团体总分报表。 二、实验内容: 【问题描述】 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。 【基本要求】 产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。 【测试数据】 对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。 【实现提示】 可以假设m≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。 【选作内容】 允许用户指定某些项目可采取其他名次取法。

实验二停车场管理 一、实验目的: (1)熟练掌握栈顺存和链存两种存储方式。 (2)掌握栈的基本操作及应用。 (3)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 二、实验内容: 【问题描述】 设停车场是一个可停放n辆汽车的长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 【测试数据】 设n=2,输入数据为:(A,1,5),(A,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。 【实现提示】 需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。 【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少? (2)汽车可有不同种类,则他们的占地面积不同收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。(3)汽车可以直接从便道开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 (4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。

数据结构课程设计报告范例

Guangxi University of Science and Technology 课程设计报告 课程名称:算法与编程综合实习 课题名称: 姓名: 学号: 院系:计算机学院 专业班级:通信121 指导教师: 完成日期:2012年12月15日

目录 第1部分课程设计报告 (3) 第1章课程设计目的 (3) 第2章课程设计内容和要求 (4) 2.1 问题描述 (4) 2.2 设计要求 (4) 第3章课程设计总体方案及分析 (4) 3.1 问题分析 (4) 3.2 概要设计 (7) 3.3 详细设计 (7) 3.4 调试分析 (10) 3.5 测试结果 (10) 3.6 参考文献 (12) 第2部分课程设计总结 (13) 附录(源代码) (14)

第1部分课程设计报告 第1章课程设计目的 仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方………………………………………………………………………………………………………………………………………………………………………………………..(省略)

第2章课程设计内容和要求 2.1问题描述: 迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。 图A 2.2设计要求: 要求设计程序输出如下: (1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏 幕上显示出来; (2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择。

数据结构查找习题及答案

第九章查找 一、选择题 1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。 A. (n-1)/2 B. n/2 C. (n+1)/2 D. n 2. 下面关于二分查找的叙述正确的是 ( ) A. 表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列 B. 表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储 3. 用二分(对半)查找表的元素的速度比用顺序法( ) A.必然快 B. 必然慢 C. 相等 D. 不能确定 4. 具有12个关键字的有序表,折半查找的平均查找长度() A. 3.1 B. 4 C. 2.5 D. 5 5.当采用分块查找时,数据的组织方式为 ( ) A.数据分成若干块,每块内数据有序 B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块 C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块 D. 数据分成若干块,每块(除最后一块外)中数据个数需相同 6. 二叉查找树的查找效率与二叉树的( (1))有关, 在 ((2))时其查找效率最低 (1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置 (2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。 7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失 败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案: A. 相同的 B.不同的 9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( ) A.(100,80, 90, 60, 120,110,130) B.(100,120,110,130,80, 60, 90) C.(100,60, 80, 90, 120,110,130) D. (100,80, 60, 90, 120,130,110) 10. 在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0右孩子的平衡因子为1,则应作( ) 型调整以使其平衡。 A. LL B. LR C. RL D. RR 11. 下面关于m阶B-树说法正确的是( ) ①每个结点至少有两棵非空子树;②树中每个结点至多有m一1个关键字; ③所有叶子在同一层上; ④当插入一个数据项引起B树结点分裂后,树长高一层。 A.①②③ B. ②③ C. ②③④ D. ③ 12. m阶B-树是一棵( ) A. m叉排序树 B. m叉平衡排序树 C. m-1叉平衡排序树 D. m+1叉平衡排序树 15. 设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链 地址法构造散列表,散列函数为H(key)=key MOD 13,散列地址为1的链中有()个记录。 A.1 B. 2 C. 3 D. 4 16. 关于哈希查找说法不正确的有几个( ) (1)采用链地址法解决冲突时,查找一个元素的时间是相同的 (2)采用链地址法解决冲突时,若插入规定总是在链首,则插入任一个元素的时间是相同的 (3)用链地址法解决冲突易引起聚集现象 (4)再哈希法不易产生聚集

数据结构查找算法课程设计

存档编号: 西安******** 课程设计说明书 设计题目: 查找算法性能分析 系别:计算机学院 专业:计算机科学 班级:计科*** 姓名:王*** (共页) 2015年01月07 日

***** 计算机科学专业课程设计任务书 姓名:*** 班级:计科**** 学号:**** 指导教师:**** 发题日期:2015-01-05 完成日期:2015-01-09 一需求分析

1.1问题描述 查找又称检索,是指在某种数据结构中找出满足给定条件的元素。查找是一种十分有用的操作。而查找也有内外之分,若整个查找过程只在内存中进行称为内查找;若查找过程中需要访问外存,则称为外查找,若在查找的同时对表做修改运算(插入或删除),则相应的表成为动态查找表,反之称为静态查找表。 由于查找运算的主要运算是关键字的比较,所以通常把查找过程中对关键字的平均比较次数(也叫平均查找长度)作为一个查找算法效率优劣的标准。 平均查找程度ASL定义为: ASL=∑PiCi(i从1到n) 其中Pi代表查找第i个元素的概率,一般认为每个元素的查找概率相等,Ci代表找到第i个元素所需要比较的次数。 查找算法有顺序查找、折半查找、索引查找、二叉树查找和散列查找(又叫哈希查找),它们的性能各有千秋,对数据的存储结构要求也不同,譬如在顺序查找中对表的结果没有严格的要求,无论用顺序表或链式表存储元素都可以查找成功;折半查找要求则是需要顺序表;索引表则需要建立索引表;动态查找需要的树表查找则需要建立建立相应的二叉树链表;哈希查找相应的需要建立一个哈希表。 1.2基本要求 (1)输入的形式和输入值的范围; 在设计查找算法性能分析的过程中,我们调用产生随机数函数: srand((int)time(0)); 产生N个随机数。 注:折半查找中需要对产生的随机数进行排序,需要进行排序后再进行输入,N<50; (2)输出形式; 查找算法分析过程中,只要对查找算法稍作修改就可以利用平均查找

数据结构课程设计说明书讲解

安徽理工大学 数据结构 课程设计说明书题目: 一元多项式计算 院系:计算机科学与工程学院 专业班级:数字媒体13-1班 学号: 2013303102 学生姓名:钱福琛 指导教师:梁兴柱 2015年 1月 9 日

安徽理工大学课程设计(论文)任务书计算机科学与工程学院

2014年 11 月 10 日安徽理工大学课程设计(论文)成绩评定表

目录 1 问题描述 2 功能描述 2.1 课题要求........................................... 2.2 软件格式规定....................................... 3 设计 2 3.1 相关函数介绍说明................................... 3.2 主程序的流程基函数调用说明......................... 4 程序设计 4 4.1 多项式存储的实现................................... 4.2 加减乘除算法....................................... 4.2.1加法运算的实现............................... 4.2.2减法运算的实现............................... 4.2.3乘法运算的实现............................... 4.2.4除法运算的实现............................... 4.3 函数调用关系图..................................... 5 运行测试

数据结构——查找,顺序查找,折半查找

实验五查找的应用 一、实验目的: 1、掌握各种查找方法及适用场合,并能在解决实际问题时灵活应用。 2、增强上机编程调试能力。 二、问题描述 1.分别利用顺序查找和折半查找方法完成查找。 有序表(3,4,5,7,24,30,42,54,63,72,87,95) 输入示例: 请输入查找元素:52 输出示例: 顺序查找: 第一次比较元素95 第二次比较元素87 …….. 查找成功,i=**/查找失败 折半查找: 第一次比较元素30 第二次比较元素63 ….. 2.利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查 询。 输入输出示例同题1的要求。 三、数据结构设计(选用的数据逻辑结构和存储结构实现形式说明) (1)逻辑结构设计 顺序查找和折半查找采用线性表的结构,二叉排序树的查找则是建立一棵二叉树,采用的非线性逻辑结构。 (2)存储结构设计 采用顺序存储的结构,开辟一块空间用于存放元素。

(3)存储结构形式说明 分别建立查找关键字,顺序表数据和二叉树数据的结构体进行存储数据 四、算法设计 (1)算法列表(说明各个函数的名称,作用,完成什么操作) 序号 名称 函数表示符 操作说明 1 顺序查找 Search_Seq 在顺序表中顺序查找关键字的数据元素 2 折半查找 Search_Bin 在顺序表中折半查找关键字的数据元素 3 初始化 Init 对顺序表进行初始化,并输入元素 4 树初始化 CreateBST 创建一棵二叉排序树 5 插入 InsertBST 将输入元素插入到二叉排序树中 6 查找 SearchBST 在根指针所指二叉排序树中递归查找关键字 数据元素 (2)各函数间调用关系(画出函数之间调用关系) typedef struct { ElemType *R; int length; }SSTable; typedef struct BSTNode{ Elem data; //结点数据域 BSTNode *lchild,*rchild; //左右孩子指针 }BSTNode,*BSTree; typedef struct Elem{ int key; }Elem; typedef struct { int key;//关键字域 }ElemType;

数据结构经典算法 C语言版

//插入排序法 void InsertSort() { int s[100]; int n,m,j,i=0,temp1,temp2; printf("请输入待排序的元素个数:"); scanf("%d",&n); printf("请输入原序列:"); for (i=0; is[n-1]); s[n]=m; for (i=0; im) { temp1=s[i]; s[i]=m; for (j=i+1; j

//堆排序 static a[8] = {0,25,4,36,1,60,10,58,}; int count=1; void adjust(int i,int n) { int j,k,r,done=0; k = r = a[i]; j = 2*i; while((j<=n)&&(done==0)) { if(j=a[j]) done = 1; else { a[j/2] = a[j]; j = 2* j; } } a[j/2] = r; } void heap(int n) { int i,j,t; for(i =n/2;i>0;i--) adjust(i,n); printf("\n初始化成堆===> "); for(i = 1;i < 8;i++) printf("%5d",a[i]); for(i = n-1;i>0;i--) { t = a[i+1]; a[i+1] = a[1]; a[1] = t; adjust(1,i); printf("\n第%2d步操作结果===>",count++); for(j = 1;j<8;j++) printf("%5d",a[j]); } }

关于数据结构课程设计心得体会范文

关于数据结构课程设计心得体会范文 心得体会是指一种读书、实践后所写的感受性文字。是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结。下面是小编搜集的关于数据结构课程设计心得体会范文,希望对你有所帮助。 关于数据结构课程设计心得体会(1) 这学期开始两周时间是我们自己选题上机的时间,这学期开始两周时间是我们自己选题上机的时间,虽然上机时间只有短短两个星期但从中确实学到了不少知识。上机时间只有短短两个星期但从中确实学到了不少知识。 数据结构可以说是计算机里一门基础课程,据结构可以说是计算机里一门基础课程,但我觉得我们一低计算机里一门基础课程定要把基础学扎实,定要把基础学扎实,然而这次短短的上机帮我又重新巩固了 c 语言知识,让我的水平又一部的提高。数据结构这是一门语言知识让我的水平又一部的提高。数据结构这是一门知识,纯属于设计的科目,它需用把理论变为上机调试。 纯属于设计的科目,它需用把理论变为上机调试。它对我们来说具有一定的难度。它是其它编程语言的一门基本学科。来说具有一定的难度。它是其它编程语言的一门基本学科。我选的上机题目是交叉合并两个链表,对这个题目,我选的上机题目是交叉合并两个链表,对这个题目,我觉得很基础。刚开始调试代码的时候有时就是一个很小的错觉得很基础。 刚开始调试代码的时候有时就是一个很小的错调试代码的时候误,导致整个程序不能运行,然而开始的我还没从暑假的状导致整个程序不能运行,态转到学习上,每当程序错误时我都非常焦躁,态转到学习上,每当程序错误时我都非常焦躁,甚至想到了放弃,但我最终找到了状态,一步一步慢慢来,放弃,但我最终找到了状态,一步一步慢慢来,经过无数次的检查程序错误的原因后慢慢懂得了耐心是一个人成功的必然具备的条件! 同时,通过此次课程设计使我了解到,必然具备的条件! 同时,通过此次课程设计使我了解到,硬件语言必不可缺少,要想成为一个有能力的人,必须懂得件语言必不可缺少,要想成为一个有能力的人,硬件

数据结构课程设计(附代码)

上海应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 姓名学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计内容说明 1. 项目一 (1) 对设计任务内容的概述 学生成绩管理** 任务:要求实现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面

(3) 程序流程图 (4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数中通过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。

数据结构——折半查找源代码

数据结构折半查找源代码 源代码: 折半查找: #include//cout,cin #include"process.h"//exit() #include"stdio.h"//EOF,NULL typedef int T; //定义关键字的类型,这里就以整形来处理 //查找表类定义 template struct Node { T key; //关键字域 /* ........ //其他域,可以自己根据需要添加 */ }; template class SSearch { private: Node *ST; int len;//表长 public: SSearch();// ~SSearch();//析构函数,删除表空间 void Create(int n); //创建时根据用户实际需求,再为相应的数据元素赋值void Display(); //输出静态表中的数据元素 int SeSearch(T key); //从表中最后一个元素开始顺序查找 void Ascendsort(); //升序排列 int BiSearch_1(T key);//折半查找,非递归算法 int BiSearch_2(T key);//折半查找,递归算法 int BiSearch2(int x,int y,T key); }; template SSearch::SSearch() {// ST=NULL; len=0;

} template SSearch::~SSearch() {//释放表空间 delete [] ST; len=0; } template void SSearch::Create(int n) { len=n; ST=new Node[len]; Node e; int i=0; cout<<"输入"<>e.key; ST[i]=e; i++; } } template int SSearch::SeSearch(T key) {//从表中最后一个元素开始顺序查找,若找到,返回位序,否则,返回-1 for(int i=len-1;i>=0;i--) if(ST[i].key==key) { cout<<"查找成功!位居第"< void SSearch::Ascendsort() { T t;

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

相关文档
最新文档