新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
主函数:
黄山区ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
main()
{
RecType *tmp=new RecType[N];
for(int i=0;iN;i++)
tmp[i].key=i;
SSTable sst;
sst.len=N;
sst.list=tmp;
printf("%d",BinarySearch(sst,6,cmp));
}
还要写一个比较函数在外边:
int cmp(KeyDT a,KeyDT b)
{
return a-b;
}
然后就可以用了!
#include stdio.h
#define N 21
void main(void)
{
int a[N];
int i,n,num;
int top,bottom,mid;
int flag=1; //如果在表列中找到数字,则值为1,否则为0
int loc=-1;//要查找的数在表列中的位置,如果loca=-1表示表列中没有这个数;如果有这个数,则它的值为所在的位置
printf("你想在多少个数中进行折半查找,请输入(1--20):");
scanf("%d",n);
while(n1 || n20)
{
printf("你输入的数不正确,请重新输入。\n");
printf("你想在多少个数中进行折半查找,请输入(1--20):");
scanf("%d",n);
}
printf("请你输入一个整数 a[1]:");
scanf("%d",a[1]);
i=2;
while(i=n) //输入从小到大的表列
{
printf("请你输入一个整数 a[%d]:",i);
scanf("%d",a[i]);
if(a[i] a[i-1])
i++;
else
printf("你输入的数不满足要求,请重新输入。\n");
}
//输出表列
printf("\n输出表列\n");
for(i=1; i=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");
printf("请你输入要查找的数:");
scanf("%d",num);
flag=1; //假设输入的数在表列中
top=n;
bottom=1;
mid=(top+bottom)/2;
while(flag)
{
printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);
if( (numa[top]) || (numa[bottom]) ) //输入的数 numa[top] 或者 numa[bottom],肯定num不在这个表列中
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num 等于找到的数
{
loc=mid;
printf("找到数 %6d 的位置%2d\n",num,loc);
break;
}
else if(a[mid]num) //若 a[mid]num,则num 一定在 a[bottom]和a[mid-1]范围之内
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]num) //若 a[mid]num,则num 一定在 a[mid+1]和a[top]范围之内
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}
if(loc==-1)
{
printf("%d 这个数在表列中没有找到。\n",num);
}
printf("折半查找结束:");
scanf("%d",n);
}
刚开始的时候数组时排好顺序的:从小到大,或者从大到小。然后将这个数组折中,用中间的这个数和要查找的数比较大小,(例如:如果我从小到大,我将数组这种后,用中间的数和要查找的数比较,如果小,则那个要查找的数绝对在中间靠左的范围里,如果大,则那个要查找的数绝对在中间靠右的范围里,然后同理,慢慢慢慢缩小范围,知道查找到为止)
#include stdio.h
#include stdlib.h
#include time.h
#define N 20
void Sort(int a[],int n) {
int i,j,k,t;
for(i = 0; i n - 1; ++i) {
k = i;
for(j = i + 1; j n; ++j) {
if(a[k] a[j]) k = j;
}
if(i != k) {
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}
int Find(int a[],int n,int x) {
int low = 0,high = n - 1,mid;
while(low = high) {
mid = (low + high)/2;
if(x == a[mid]) return mid;
else if(x a[mid]) low = mid + 1;
else high = mid - 1;
}
return -1;
}
void Show(int a[],int n) {
int i;
for(i = 0; i n; ++i) {
printf("%d ",a[i]);
}
printf("\n");
}
int main() {
int a[20],i,x,res;
srand((unsigned)time(NULL));
for(i = 0; i N; ++i)
a[i] = rand()%N; // 每个数都在1 -- 100之间
Show(a,N);
Sort(a,N);
Show(a,N);
x = rand()%100 + 1;
res = Find(a,N,x);
if(res = 0) printf("数值%d的下标为%d。\n",a[res],res);
else printf("数列中没有找到数值%d。\n",x);
return 0;
}
//参考代码如下:
#include stdio.h
int main()
{
int i, j, n, k=0, isFound=0;
int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8}; //测试数组
printf("请输出一个整数:\n");
scanf("%d", n);
i = (int)15/2; //对折位移量
j = (int)15/2; //取数“指针”
while(k2)
{
i = (int)i/2;
if(i == 0) k++; //i==0 即折半到无可再折时,仍有最后一次比较,故以k做计数
//若未相等,计算下一循环指针的位置
if(nnum[j])
j = j + (i + 1);
else if(nnum[j])
j = j - (i + 1);
else
{
isFound = 1;
break; //若找到相等数,标记已找到并退出循环
}
}
//输出结果
if(isFound)
printf("该数是数组中第%d个元素的值\n", j);
else
printf("查无此数!\n");
return 0;
}