如何实现二分查找法.在线等!

xsp919 2005-06-24 10:21:36
有0到100条信息,每条长度不定.但最大长度为12.比如:第一条为:abve,第二条为:cdref.第三条为:fefadg.现需要加入一条新的信息进去.但加入之后需要按字母排序.例如新加入的为bdefdaghi.则原来的第二条开始往后移一为.新的一条为第二条信息.
现在我需要使用二分进行计算.首先对比新加入的信息和已有信息的中间一条.如果大于的话.又取后面中间的一条对比.以此类推.
直到找到相同的.(第一个字母相同)然后再对比第二个字母.直到排好序.

大家有什么比较好的算法.解决方法.拜求!!
...全文
401 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
aSalt 2005-06-29
  • 打赏
  • 举报
回复
这个帖子顶回复了,改天看看,二一分我都是查找的,还能排序啊~~思路一样,抄啊~~~~
robot_wind 2005-06-29
  • 打赏
  • 举报
回复
想到要用一个较好的数据结构
可惜自己是新手
好好向megaboy学习……
ILPnow 2005-06-29
  • 打赏
  • 举报
回复
megaboy 厉害啊,可惜我刚开始学C语言,看不懂,郁闷,学习中
foochow 2005-06-29
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
又厉害又有时间,PF
megaboy 2005-06-28
  • 打赏
  • 举报
回复
使用的时候先定义一个Message变量,调用函数的时候用此变量的地址作参数,先初始化,用完后再运行clearmessage释放内存,如:

Message MTest;

initmessage(&MTest);

................

clearmessage(&MTest);
hbcb 2005-06-28
  • 打赏
  • 举报
回复
学习
megaboy 2005-06-28
  • 打赏
  • 举报
回复
/*message.c*/

/******************************************
*属性:以二叉搜索树组织起来的字符项目列表*
*可进行的操作:初始化一个列表 *
* 添加一个项目 *
* 删除一个项目 *
* 搜索整个列表 *
* 清空列表 *
* 遍历列表并运行用户操作 *
* 检测列表是否为空 *
* 检测列表是否已满 *
******************************************/
#include<string.h>
#include<stdlib.h>
#include"message.h"

static void traceall1(Node *,void(*)(Node *));
static void freenode(Node *);

/******************************************
*功能:初始化一个列表 *
*参量:MMessage:表头指针 *
*返回值:ERROR:对一个已初始化的列表操作 *
* TRUE :初始化成功 *
******************************************/
Bool initmessage(Message * MpMessage)
{
if(MpMessage->InitTag==1) return ERROR;
MpMessage->Root=NULL;
MpMessage->Count=0;
MpMessage->InitTag=TRUE;
return TRUE;
}

/******************************************
*功能:搜索列表找出符合条件的项目 *
*参量:iTag:0表示搜索与cpMessage相同的项*
* 目,1表示搜索cpMessage应添加*
* 加到的位置 *
* cpMessage:操作字符串 *
* NpNode:起始项目指针 *
*返回值:NULL:参数超出范围 *
* 指针:iTag=0时返回与cpMessage相 *
* 同的项目的指针,iTag=1时返*
* 回cpMessage应添加到的位置 *
* 的父节点指针 *
******************************************/
Node * seekmessage(int iTag,char * cpMessage,Node * NpNode)
{
Node * NpTemp=NULL;
int iSign;
if(iTag<0 || iTag>1 || strlen(cpMessage)>SIZE-1 || NpNode==NULL) return NULL;
iSign=strcmp(cpMessage,NpNode->Message);
if(!iTag)
{
if(!iSign) NpTemp=NpNode;
}
else
{

if(iSign<0)
{
if(NpNode->Left==NULL) NpTemp=NpNode;
}
else if(NpNode->Right==NULL) NpTemp=NpNode;
}
if(NpTemp==NULL && NpNode->Left!=NULL && !(iTag==1 && iSign>0)) NpTemp=seekmessage(iTag,cpMessage,NpNode->Left); /*递归搜索左子树*/
if(NpTemp==NULL && NpNode->Right!=NULL) NpTemp=seekmessage(iTag,cpMessage,NpNode->Right); /*递归搜索右子树*/
return NpTemp;
}

/*****************************************
*功能:添加一个项目 *
*参量:cpMessage:添加的新项目 *
* MpMessage:表头指针 *
*返回值:ERROR:表头指针为空 *
* 列表未初始化 *
* 添加的项目长度超过最大值*
* FALSE:内存已没有足够的空间 *
* 列表中有相同的项目 *
* 新项目位置无法确定 *
* TRUE :添加成功 *
*****************************************/
Bool addmessage(char * cpMessage,Message * MpMessage)
{
Node * NpTemp,* NpNode;
if(MpMessage==NULL || MpMessage->InitTag!=1 || strlen(cpMessage)>SIZE-1) return ERROR;
if((NpTemp=(Node *)malloc(sizeof(struct node)))==NULL) return FALSE;
if(MpMessage->Root==NULL) /*若列表为空*/
{
NpTemp->Parent=NpTemp->Left=NpTemp->Right=NULL;
MpMessage->Root=NpTemp;
}
else
{
if((NpNode=seekmessage(0,cpMessage,MpMessage->Root))!=NULL) return FALSE;
if((NpNode=seekmessage(1,cpMessage,MpMessage->Root))==NULL) return FALSE;
if(strcmp(cpMessage,NpNode->Message)<0) NpNode->Left=NpTemp;
else NpNode->Right=NpTemp;
NpTemp->Parent=NpNode;
NpTemp->Left=NpTemp->Right=NULL;
}
strcpy(NpTemp->Message,cpMessage);
MpMessage->Count++;
return TRUE;
}

/*****************************************
*功能:删除一个项目 *
*参量:cpMessage:要删除的项目 *
* MpMessage:表头指针 *
*返回值:ERROR:列表未初始化 *
* FALSE:列表中没有要删除的项目 *
* 右子树新位置无法确定 *
* TRUE :删除成功 *
*****************************************/
Bool delemessage(char * cpMessage,Message * MpMessage)
{
Node * NpTemp,* NpNode,** NpUpLevel;
if(MpMessage->InitTag!=1) return ERROR;
if(isempty(MpMessage)) return FALSE;
if((NpTemp=seekmessage(0,cpMessage,MpMessage->Root))==NULL) return FALSE;
if(NpTemp->Parent==NULL) NpUpLevel=&MpMessage->Root; /*若为根节点,NpUpLevel指向表头指针*/
else NpUpLevel=(NpTemp==NpTemp->Parent->Left?&NpTemp->Parent->Left:&NpTemp->Parent->Right); /*非根节点,UpUpLevel指向左子节点或右子节点*/
if(NpTemp->Right!=NULL)
{
if(NpTemp->Left!=NULL)
{
if((NpNode=seekmessage(1,NpTemp->Right->Message,NpTemp->Left))==NULL) return FALSE; /*检查右子树有否新位置*/
if(strcmp(NpTemp->Right->Message,NpNode->Message)<0) NpNode->Left=NpTemp->Right;
else NpNode->Right=NpTemp->Right;
NpTemp->Right->Parent=NpNode;
}
else
{
*NpUpLevel=NpTemp->Right;
NpTemp->Right->Parent=NpTemp->Parent;
}
}
if(NpTemp->Left!=NULL)
{
*NpUpLevel=NpTemp->Left;
NpTemp->Left->Parent=NpTemp->Parent;
}
else if(NpTemp->Right==NULL) *NpUpLevel=NULL;
MpMessage->Count--;
free(NpTemp);
return TRUE;
}

/*****************************************
*功能:遍历列表并执行用户自定义函数 *
*参量:MpMessage:表头指针 *
* fpOperation:用户函数指针 *
*返回值:ERROR:列表未初始化 *
* FALSE:列表为空 *
* TRUE :遍历成功 *
*****************************************/
Bool traceall(Message * MpMessage,void (* fpOperation)(Node * NpNode))
{
if(MpMessage->InitTag!=1) return ERROR;
if(MpMessage->Root==NULL) return FALSE;
traceall1(MpMessage->Root,fpOperation);
return TRUE;
}

/*****************************************
*功能:清空列表 *
*参量:MpMessage:表头指针 *
*返回值:ERROR:列表未初始化 *
* TRUE :清空成功 *
*****************************************/
Bool clearmessage(Message * MpMessage)
{
if(MpMessage->InitTag!=1) return ERROR;
if(MpMessage->Root==NULL) return TRUE;
traceall(MpMessage,freenode);
return TRUE;
}

/*****************************************
*功能:检测列表是否为空 *
*参量:MpMessage:表头指针 *
*返回值:ERROR:列表未初始化 *
* FALSE:非空 *
* TRUE :为空 *
*****************************************/
Bool isempty(Message * MpMessage)
{
if(MpMessage->InitTag!=1) return ERROR;
return MpMessage->Count?FALSE:TRUE;
}

/*****************************************
*功能:检测列表是否已满 *
*参量:无 *
*返回值:FALSE:非满 *
* TRUE :已满 *
*****************************************/
Bool isfull()
{
Node * NpNode;
NpNode=(Node *)malloc(sizeof(struct node));
if(NpNode!=NULL) free(NpNode);
return NpNode!=NULL?FALSE:TRUE;
}

static void traceall1(Node * NpTemp,void(*fpOperation)(Node * NpNode))
{
if(NpTemp->Left!=NULL) traceall1(NpTemp->Left,fpOperation);
if(NpTemp->Right!=NULL) traceall1(NpTemp->Right,fpOperation);
(*fpOperation)(NpTemp);
return;
}

static void freenode(Node * NpNode)
{
free(NpNode);
return;
}
megaboy 2005-06-28
  • 打赏
  • 举报
回复
程序写好了,先贴头文件,再贴函数体:

/*message.h头文件*/

#ifndef MESSAGE_H_
#define MESSAGE_H_

#if defined(SIZE)
#undef SIZE
#endif

#define SIZE 13 /*定义每个项目的最大字符数目(含\0)*/

#if defined(ERROR)
#undef ERROR
#endif

#if defined(FALSE)
#undef FALSE
#endif

#if defined(TRUE)
#undef TRUE
#endif

typedef enum {ERROR=-1,FALSE,TRUE} Bool;

typedef struct node
{
char Message[SIZE];
struct node * Parent; /*父节点指针*/
struct node * Left; /*左子树指针*/
struct node * Right; /*右子树指针*/
} Node;

typedef struct message
{
Node * Root; /*表头指针*/
int Count; /*项目数量*/
Bool InitTag; /*初始化标志*/
} Message;

extern Bool initmessage(Message *);
extern Node * seekmessage(int,char *,Node *);
extern Bool addmessage(char *,Message *);
extern Bool delemessage(char *,Message *);
extern Bool traceall(Message * ,void (*)(Node * NpNode));
extern Bool clearmessage(Message *);
extern Bool isempty(Message *);
extern Bool isfull();

#endif
megaboy 2005-06-24
  • 打赏
  • 举报
回复
楼主的思路不是很好,应该用动态链表建立一个二叉搜索树,这样不仅搜索快速,而且添加和删除项目极其方便。如果楼主用c语言的话,可以把这颗树封装在一个ADT里面。
CassiaBlossom 2005-06-24
  • 打赏
  • 举报
回复
#include"stdio.h"
void BInsertSort(int l[],int n )
{
int low,high,temp,i,j,mid;
for(i=1;i<=n-1;i++){
temp=l[i];
low=1;
high=i-1;
while(low<=high){
mid=(low+high)/2;
if(temp<l[mid]) high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=high+1;j--){ l[j+1]=l[j];}
l[low]=temp;
}
}

看看这个就知道了
jozosoft 2005-06-24
  • 打赏
  • 举报
回复
用你自己說的二分法就可以呀/
megaboy 2005-06-24
  • 打赏
  • 举报
回复
这两天有时间给你写一个ADT版的,我只写核心部分,其余的你自己搞定,用起来也很容易的,直接使用我提供的函数就行。把我给你的源文件转换成lib,使用的时候把lib跟你的文件一起编译,同时使用我提供给你的头文件。
xsp919 2005-06-24
  • 打赏
  • 举报
回复
楼上的具体指点一下.谢~~
我刚学没多久,菜死了.不知道该怎么弄.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧