小白学新知:实现整型有序数组的二分查找。

1.什么是二分查找?(binary search)

二分查找是一种高效的查找方法,其基本思想是将目标值与数组中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找,不断缩小搜索范围,直到找到目标值或确定目标值不存在为止。

2.算法要求

     1.必须采用顺序存储结构
     2.必须按关键字大小有序排序

3.实现方法

例如:数组ccb[]={1,2,3,4,5,6,7,,8,9,10}

假设要查找的元素为3。

查找一次也就是折半一次,大大的提高查找的效率。

通过中间元素的变化,实现高效查找。

4.C语言实现 

//整型有序数组的二分查找
#include<stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 5;
    int left = arr[0];
    int sz = sizeof(arr) / sizeof(arr[0]);
    int right = sz - 1;
    while (left <= right)
    {
        int mid = (left + right) / 2;
        //中间值每次循环都要变化,否则中间值一直不变,会陷入while死循环。
        if (arr[mid] < k)
        {
            left = mid + 1;
        }
        if (arr[mid] > k)
        {
            right = mid - 1;
        }
        if (arr[mid] == k)
        {
            printf("找到了,下标是:%d", mid);
            break;
        }
    }
    if (left > right)
    {
        printf("没找到。");
    }
    return 0;
}

 

方法2 自定义函数。

 

 #define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 int binary_search(int arr[], int k, int sz)//形参arr看上去是数组,本质上是指针。
	// 数组传参实际上传递的是数组首元素的地址,而不是整个数组,
	 // 所以在函数内部计算一个函数参数部分的数组元素的个数是不靠谱的。
	  //所以sz=sizeof(arr)/sizeof(arr[])  在函数内部算出的是不准确的。
	  //传递的是数组首元素的地址

{
	 int left = arr[0];
	 int right = sz - 1;
	 while(left<=right)
	 {
		 int mid = left + (right - left) / 2;
		 if (arr[mid] < k)
		 {
			 left = mid + 1;
		 }
		 if (arr[mid] > k)
		 {
			 right = mid - 1;
		 }
		 if (arr[mid] == k)
		 {
			 return mid;
		 }
		 if (left > right)
		 {
			 return -1;
		 }
	}
}
 //形参和实参的名字可以相同,也可以不同。
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);//输入需要查找的元素。
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = binary_search(arr, k, sz);

	
	//写一个函数进行查找。
	//找到了,返回下标
	//没找到,返回-1。不能返回0,因为有下标为0的元素。
	if (ret == -1)
	{
		printf("没找到。\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}

	return 0;
}

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Swift基础篇中,你将学习到以下几个新知识点: 1. 变量和常量:Swift中使用var关键字定义变量,使用let关键字定义常量。变量可以被修改,而常量的值一旦设定就不能再改变。 2. 数据类:Swift提供了多种数据类,包括整、浮点、布尔、字符串等。你可以根据需要选择合适的数据类来存储和操作数据。 3. 可选类:可选类是Swift中的一种特性,用于处理可能为空的值。通过使用可选类,你可以明确表示一个值是存在还是不存在。 4. 控制流:Swift提供了多种控制流语句,包括条件语句(if语句、switch语句)、循环语句(for-in循环、while循环)等。这些语句可以帮助你根据不同的条件执行不同的代码块。 5. 函数:函数是一段完成特定任务的独立代码块。在Swift中,你可以定义自己的函数,并通过参数和返回值来传递数据。 6. 结构体和类:结构体和类是Swift中用于封装数据和功能的重要工具。你可以使用结构体和类来创建自定义的数据类,并定义属性和方法来操作这些数据类。 7. 集合类:Swift提供了多种集合类,包括数组、字典和集合。这些集合类可以用于存储和操作多个值。 8. 可选绑定:可选绑定是一种用于安全地解包可选类的方法。通过可选绑定,你可以判断可选类是否包含值,并将其解包并赋值给一个临时变量或常量。 9. 错误处理:Swift中的错误处理机制可以帮助你处理可能发生的错误情况。你可以使用try、catch语句来捕获和处理错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值