因为期末考,放空了好多知识,发烧刚好马上来上货咯!
#include<stdio.h>
//开始进入搜索步骤
int search(int key,int a[],int len)
{
//作为标记判断是否存在key
int ret = -1;
//定义左右位置的下标
int right = 0 ;
int left = len-1 ;
//通过循环判断
while(right<=left)
{
//中间值由左右除二可得,并且每次都要更新,所以放入循环当中
int mid = (right+left)/2;
//开始判断 key 与 a[mid] 的关系
if(a[mid]==key)
{
ret = mid;
break;
}
else if (a[mid]>key)
{
left=mid-1;
}
else
{
right = mid+1;
}
}
//最终返回标记
return ret;
}
//寻出最大值
int max(int a[],int len)
{
//假设: a[0]为最大值,并与 a[i]比较,不断变化
int maxid = 0;
//用来遍历整个数组,并小于len
int i=0;
//用for循环实现
for(i=1;i<len;i++)
{
if (a[i]>a[maxid])
{
maxid = i;
}
}
//返回最大值下标
return maxid;
}
int main ()
{
//随机定义数据
int a[]={25,26,12,1,3,8,90,15,16,17,};
//数组长度
int len = sizeof(a)/sizeof(a[0]);
//int maxid = max(a,len);
//打印最大值,检查是否正确
//printf("%d\n",a[maxid]);
//排列有序数组
int i = 0;
//交换 a[maxid] 与 a[len-1]
for (i=len-1;i>0;i--)
{
//寻出最大值 (i+1=len)
int maxid = max(a,i+1);
//开始交换,并有序排列
int swap = a[maxid];
a[maxid]= a[i];
a[i]=swap;
}
//通过循环把有序数组打印出来
for(i=0;i<len;i++)
{
printf(" %d ",a[i]);
}
printf("\n");
//二分法应用
//key为要搜索的数字
int key =12;
//开始进入搜索步骤
int ret = search(key,a,len);
//由标记来输出下标或判断是否存在
if(ret!= -1)
{
printf("下标为 %d\n",ret);
}
else
{
printf("该数字不存在该数组");
}
return 0;
}