查找的几种方法(顺序查找、折半查找)

顺序查找

是将表中记录(R1 R2……Rn)按其序号存储于一维数组空间,设给定值为k,在表(R1 R2……Rn)中,从R(n)开始,n–查找R(n)=k的记录;
(而言之就是:一个一个找,知道找到为止);
优点:简单易懂;
缺点:效率很低;

具体代码如下

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef int data_t;

typedef struct{
	data_t *data;
	int maxlen;
	int last;
}sq,*linlist;

int main(){
	int i,j;

	/*creart sq*/
	printf("input sq maxlen:");
	linlist S;
	S = (linlist)malloc(sizeof(sq));

	S->last = -1;

	scanf("%d",&i);
	S->maxlen = i;

	S->data = (data_t *)malloc(S->maxlen * sizeof(data_t));

	memset(S->data,0,(S->maxlen * sizeof(data_t)));

	/*insert sq*/
	printf("input sq data");
	i = 0;
	while((S->maxlen - 1) != S->last){
		scanf("%d",&i);
		if(i == -1){
			break;
		}
		S->data[(S->last + 1)] = i;
		S->last++;
	}

	/*show sq*/
	i = 0;
	while(i <= S->last){
		printf("%d",S->data[i]);
		i++;
	}
	puts("");

	/*find "i" in sq*/
	i = 0;
	while(i != -1){
		printf("input find data");
		scanf("%d",&i);
		j = S->last;
		while(j >= 0){
			if(i == S->data[j]){
				printf("%d\n",j);
				break;
			}
			j--;
		}
		if(j < 0){
			printf("find data don't in sq\n");
		}
	}

	/*free sq*/
	free(S->data);
	S->data = NULL;
	free(S);
	S = NULL;
	return 0;
}

代码运行结果

input sq maxlen:5
input sq data
1
2
3
4
5
12345
input find data:4
find data 4 in sq set is 3
input find data:10
find data don't in sq

折半查找

对给定值k,逐步确定待查记录所在区间,每次将搜索空间减少一半(折半),直到查找成功或失败为止。
设两个游标low、high,分别指向当前待查找表的上界(表头)和下界(表尾)。mid指向中间元素。
优点:效率有所提高;
缺点:要求存储的数据有序;

具体代码如下

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef int data_t;

typedef struct{
	data_t *data;
	int maxlen;
	int last;
}sq,*linlist;

int main(){
	int i,low,high,min;

	/*creart sq*/
	printf("input sq maxlen:");
	linlist S;
	S = (linlist)malloc(sizeof(sq));

	S->last = -1;

	scanf("%d",&i);
	S->maxlen = i;

	S->data = (data_t *)malloc(S->maxlen * sizeof(data_t));

	memset(S->data,0,(S->maxlen * sizeof(data_t)));

	/*insert sq*/
	printf("input sq data");
	i = 0;
	while((S->maxlen - 1) != S->last){
		scanf("%d",&i);
		if(i == -1){
			break;
		}
		S->data[(S->last + 1)] = i;
		S->last++;
	}

	/*show sq*/
	i = 0;
	while(i <= S->last){
		printf("%d",S->data[i]);
		i++;
	}
	puts("");

	/*find i in sq*/
	i = 0;
	scanf("%d",&i);
	low = 0;
	high = S->last;
	//	min = (high - low)/2;

		while(low <= high){

		min =(high + low)/2;
		if(i == S->data[min]){
		printf("%d\n",min);
		break;
		}
		else if( S->data[min] > i){
		high = min-1;
		}
		else{
		low = min+1;
		}

		}
		if(low > high){
		printf("sq don't data\n");
		}


	/*free sq*/
	free(S->data);
	S->data = NULL;
	free(S);
	S = NULL;
	return 0;
}

代码运行结果

input sq maxlen:5
input sq data:
2
4
6
8
10
2,4,6,8,10,
input will find data
10
10 in the sq set is 4


input sq maxlen:5
input sq data:
2
4
6
8
10
2,4,6,8,10,
input will find data
20
sq don't data

代码不足之处较多,还请各位指教。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值