编程成长日记——折半查找

编写一个折半查找函数

#include<stdio.h>
//编写折半查找函数

int binsearch(int a,int num[],int b )
{
	int left=0,right=b-1,mid=0;
	while(left<=right)
	{   
		int mid=(left+right)/2; 
		if (num[mid]<a)
		{
			left=left+1;
		}
		else if (num[mid]==a)
		{
			return mid;
		}
		else
		{
			right=mid-1;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("请输入你想找的数字:\n");
	scanf("%d", &key);
	int ret = binsearch(key, arr, sz);
	if (ret == -1)
	{
		printf("不存在!\n");
	}
	else
	{
		printf("%d在数组中为arr[%d]\n", key,ret);
	}

	return 0;
}

在这个代码中最重要的是理解折半查找的含义,分析每次循环的条件判断,当key>mid时,

left应该右移一次;档key<mid时,right应该左移一次;还有需要注意的是,用mid=left+right的方法并不是很安全,有可能会溢出,另外,折半查找只适用于一个有序的数组中查找具体的数字。

时间: 2024-08-06 16:06:43

编程成长日记——折半查找的相关文章

编程成长日记——有意思的编程题(一)

//日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词. //A说:不是我. //B说:是C. //C说:是D. //D说:C在胡说 //已知3个人说了真话,1个人说的是假话. //现在请根据这些信息,写一个程序来确定到底谁是凶手. #include<stdio.h> int main() { int i=0; int killer=0; for(i=0;i<4;i++) { killer=65+i; if((killer!='A' )+(ki

编程成长日记——杨辉三角

#include<stdio.h>  //杨辉三角  int main() { int i=0,j=0,n=0,k=0;   int a[100][100]={1,0};   printf("请输入杨辉三角形的行数:");   scanf("%d",&n);    for(i=0;i<=n;i++) {       for(j=0;j<=n;j++)   {         a[i][0]=1;         a[i][i]=1;

编程成长日记——打印菱形图案

#include<stdio.h> //打印菱形图案  int main() { int i=0,j=0,n=0; printf("请输入一个数字:\n"); scanf("%d",&n); printf("\n"); for(i=1;i<=n;i++) { for (j=1;j<=n-i;j++) { printf(" "); } for (j=1;j<=(2*i-1);j++) { p

编程成长日记————模拟三次输入密码

简单的模拟取钱时输入密码: #include<stdio.h> #include<windows.h> #include<string.h> int main () { int i=0; int n=2; char passwd[10]; char *p="123456"; for (i=0;i<3;i++) { printf("请输入密码:\n");     scanf("%s",passwd); if

编程成长日记——重拾C语言&lt;二&gt;

关于按位与&和逻辑右移>> 求一个数的二进制的时候,可以采用这种方法,向右移一位,相当于除以二,所以有以下代码: #include<stdio.h> //求一个数的二进制  int main()  {     char arr[32];    int num=0;    int i=0;    printf("请输入一个数字:");    scanf("%d",&num);    for(i=0;i<32;i++)   

编程成长日记————猜数字游戏

模拟猜数字游戏,提示用户每次应输入的数字范围. #include <stdio.h> #include <stdlib.h> //猜数字游戏 int main() { int i=0; int num =0,ret=0,choose=0; int min=1,max=100; flag: srand((unsigned)time(NULL));  ret=rand()%100+1; while(1) { printf("请输入%d~%d之间的数字:\n",min

编程成长日记——重拾C语言

人生总是需要一个契机才会去改变,其实与其说是契机,也不过是自己再给自己一次机会而已. 重拾C语言,我决定再给自己一次机会,不知道多年以后的我再次翻看这篇博客的时候会是怎样的心情,会不会记得当下身为大三狗的我终于想要告别一事无成,一无所获,一败涂地的颓废而不自知的大学生活,我不想说是为了理想而奋斗,更不是为了中华崛起,只是为了我自己,仅此而已. 感谢比特,给我一次改变的机会. 从零开始学起C语言. --------------------------------------煽情分割线-------

快速排序及折半查找

数据结构与算法---快速排序及折半查找: 1)编程实现数据序列的输入2)实现快速排序算法,并对输入的序列排序后输出: 3)实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地查找,并输出查询结果.(查找成功/不成功:等于关键值的元素个数=1或>1) 1 #include <stdio.h> 2 #define N 100 3 4 //快速排序算法并输出 5 void Quick_Partition(double *r, int i, int j) 6 { 7 double x =

C语言程序设计100例之(21):折半查找

例21  折半查找 问题描述 顺序查找是一种最简单和最基本的检索方法.其基本思想是:从检索表的一端(如表中第一个记录或最后一个记录)开始,逐个进行记录的关键字和给定值的比较.若某个记录的关键字和给定值比较相等,则查找成功:否则,若直至检索表的另一端(如最后一个记录或第一个记录),其关键字和给定值比较都不等,则表明表中没有待查记录,查找不成功. 顺序查找可以写成一个简单的一重循环,循环中依次将检索表(不妨设为数组a)中的元素与给定值比较,若相等,用break退出循环.算法描述为: for (i=0