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.关联表,输入某一个金额,打印对应金额的英文表达方式:
金额与其英文表达的关系为:
金额大小 | 英文名称 |
---|---|
1 | penny |
5 | nickel |
10 | dime |
25 | quarter |
50 | hale-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;
}