数组搜索

1.在一串数组中,查某一个数的位置:

#include <stdio.h>
int search(int key,int a[],int len)   //len为数组的长度,不确定数组a的长度,可以暂时为空
{
	int i,ret=-1;  //没有找到key值的位置
	for(i=0;i<len;i++)   //数组的循环是 0<i && i<len
	{
		if(key==a[i])  //key与遍历到的值相等
		{
			ret=i;   //将该值的位置赋值给ret
			break;
		 } 
	}
	 return ret;	//返回该值
}
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,10};   //给数组赋值
	int r=search(17,a,sizeof(a)/sizeof(a[0]));  //引用函数,并赋值
	printf("%d",r);
	return 0;
}

查找17的位置:(-1表示没有找到该值)
在这里插入图片描述

2.关联表,输入某一个金额,打印对应金额的英文表达方式:

金额与其英文表达的关系为:

金额大小英文名称
1penny
5nickel
10dime
25quarter
50hale-dollar
#include <stdio.h>

int amount[]={1,5,10,25,50};
char *name[]={"penny","nickel","dime","quarter","hale-dollar"};//也可以写这里

int search(int key,int a[],int len) 
{
	int i,ret=-1;//没有找到key值的位置
	for(i=0;i<len;i++)
	{
		if(key==a[i])
		{
			ret=i;
			break;
		 } 	 	
	}
	return ret;
}
int main()
{
	int amount[]={1,5,10,25,50};//金额大小
	char *name[]={"penny","nickel","dime","quarter","hale-dollar"};//指针数组,英文表达
	//int a[]={1,2,3,4,5,6,7,8,9,10};
	int r=search(10,amount,sizeof(amount)/sizeof(amount[0]));
	if(r>-1)  //找到对应的金额
	{
		printf("%s",name[r]);  //输出的是字符串%s
	}
	return 0;
}

在这里插入图片描述

3.二分法
运用二分法的前提是,数组里的数据是从小到大排好的

#include <stdio.h>
int search(int key,int a[],int len) 
{
	int left=0;
	int right=len-1;
	int ret=-1;//没有找到key值的位置 
	while(right>left)
	{
		int mid=(left+right)/2;
		if(a[mid]==key)
		{
			ret=mid;
			break;
		}
		else if(a[mid]>key)
		{
			right=mid-1;
		}
		else 
		{
			left=mid+1;
		}
	}
	return ret;
} 
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,10};
	int r=search(2,a,sizeof(a)/sizeof(a[0]));//不满足首位和末尾,此时right=left,跳出循环
	printf("%d",r);
	return 0;
}

在这里插入图片描述

4.选择排序
将一串无序的数组按从小到大排好

#include <stdio.h>
int max(int a[],int len)
{
	int maxid=0,i=1 ;
	for(;i<len;i++)
	{
		if(a[i]>a[maxid]) 
		{
			maxid=i;
		}
	}
	return maxid;
}

int main()
{
	int a[]={55,2,3,4,5,999999,7,8,9,1999};  
	int len=sizeof(a)/sizeof(a[0]);
	int i=len-1;
	
	//选择排序,每次选出一个最大的值,以此与最右侧的值调换位置 
	for(i=len-1;i>0;i--)
	{
		int maxid=max(a,i+1);  
		int t=a[maxid];
		a[maxid]=a[i];
		a[i]=t;
		
	}
	for(i=0;i<len;i++)
	{
		printf("%d ",a[i]);  //将排序好的数,依次输出
	}
	return 0;
}


在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值