7.2编写程序实现:输入10个数据,按从小到大用选择法排序,然后输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。

#include<stdio.h>
int main()
{
	int a[10];
	int i, j, t, min;
	int left = 0;
	int right = sizeof(a) / sizeof(a[0]);
	int key = 0;
	int mid;
	printf("请输入十个数:\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);

	for (i = 0; i < 10; i++)
	{
		min = a[i];
		for (j = i + 1; j < 10; j++)
		{
			if (a[j] < a[i])
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
	for (i = 0; i < 10; i++)
		printf("%d  ", a[i]);



	printf("请输入要查找的数字: ");

	scanf("%d", &key);

	// 二分查找

	while (left < right)

	{
		// 找到中间位置

		mid = left + ((right - left) >> 1);

		if (key == a[mid])

		{
			printf("%d\n", mid+1);

			break;

		}

		else if (key < a[mid])

		{
			right = mid;

		}

		else

		{
			left = mid + 1;

		}

	}

	if (left >= right)

		printf("无此数\n");

	return 0;

}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 折半查找也称为二分查找,它是一种高效的查找算法。 下面是使用折半查找在已经排好序的数组中查找特定元素的步骤: 1. 确定组的左、右下标,初始时左下标为0,右下标为组长度减1。 2. 计算中间位置的下标,即 (左下标 + 右下标) / 2。 3. 如果中间位置的元素等于目标,则返回该位置的下标。 4. 如果中间位置的元素大于目标,则目标可能在左半部分,将右下标移动到中间位置减1。 5. 如果中间位置的元素小于目标,则目标可能在右半部分,将左下标移动到中间位置加1。 6. 重复步骤2到步骤5,直到左下标大于右下标,此时目标不存在于数组中,返回-1。 因此,如果要在已经排好序的包含15个元素数组中查找一个元素的下标,可以按照以上步骤进行操作,直到找到目标元素的下标或者确认该元素不在数组中。好的,以下是用中文回答您的问题: 这个问题可以使用折半查找来解决。折半查找是一种高效的查找算法,适用于已排序的组。 具体实现如下: 1. 将组按照从小到大顺序排序。 2. 定义变量 low 和 high 分别表示组的起始下标和结束下标。 3. 循环执行以下操作: a. 将中间位置的下标 mid 计算来,即 mid = (low + high) // 2。 b. 如果要查找的等于数组中下标为 mid 的,返回 mid。 c. 如果要查找的小于数组中下标为 mid 的,说明要查找的组的左半部分,将 high 设为 mid - 1。 d. 如果要查找的大于数组中下标为 mid 的,说明要查找的组的右半部分,将 low 设为 mid + 1。 4. 如果循环结束时还没有找到要查找的,说明该数不存在于数组中,返回 -1。 下面是实现算法的 Python 代码: ``` def binary_search(nums, target): low, high = 0, len(nums) - 1 while low <= high: mid = (low + high) // 2 if nums[mid] == target: return mid elif nums[mid] > target: high = mid - 1 else: low = mid + 1 return -1 ``` 您可以将要查找的组作为函的参进行调用,函将返回要查找的数组中的下标,如果不存在则返回 -1。 ### 回答2: 折半查找又称二分查找,是一种高效的查找算法,适用于有序的组。 假设给定的组为arr,要查找的为num,数组中元素个为n。则折半查找的基本思路如下: 1. 取数组中间位置mid,比较arr[mid]和num的大小关系 2. 如果arr[mid]等于num,直接返回mid,查找成功; 3. 如果arr[mid]大于num,则在左侧数组中继续查找(由于组已经按小到大排序,因此左侧组的最后一个元素下标为mid-1,右侧组的第一个元素下标为mid+1); 4. 如果arr[mid]小于num,则在右侧数组中继续查找; 5. 重复1-4步,直到找到num或者左侧组下标大于右侧组下标,此时查找失败。 根据上述思路,可以设计下面的算法: ``` int binarySearch(int arr[], int n, int num) { int left = 0, right = n - 1; while(left <= right) { int mid = (left + right) / 2; if(arr[mid] == num) { return mid; } if(arr[mid] > num) { right = mid - 1; } else { left = mid + 1; } } return -1; // 查找失败,返回-1 } ``` 其中,n为组元素个,left和right为组左右边界。 假设有15个存放在组arr中,并已经按小到大排序,要查找的为num,则可以直接调用binarySearch函找到num在arr数组中的下标。 示例代码如下: ``` #include <stdio.h> int binarySearch(int arr[], int n, int num); int main() { int arr[15] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29}; int n = 15, num, pos; printf("请输入要查找的:"); scanf("%d", &num); pos = binarySearch(arr, n, num); if(pos == -1) { printf("查找失败,%d不在数组中\n", num); } else { printf("%d在数组中的下标为%d\n", num, pos); } return 0; } int binarySearch(int arr[], int n, int num) { int left = 0, right = n - 1; while(left <= right) { int mid = (left + right) / 2; if(arr[mid] == num) { return mid; } if(arr[mid] > num) { right = mid - 1; } else { left = mid + 1; } } return -1; // 查找失败,返回-1 } ``` ### 回答3: 折半查找,也称二分查找,是一种高效而简单的查找算法。它的基本思想是:将有序表分成两个部分,然后查找表中间位置的元素,如果该元素与查找关键字相等,就查找成功;否则根据它与查找关键字的大小关系,确定下一步查找的区间,不断缩小区间范围,直到查找到关键字或查找区间为空为止。 按照题目中的要求,我们可以先定义一个包含15个组,并将它按从小到大顺序排好。 接着,我们可以编写一个函实现折半查找的功能。该函接受两个参:要查找的和待查找的组。具体实现过程如下: 1. 初始化左边界 left 和右边界 right,分别为 0 和 14。 2. 如果 left > right,说明数组中没有要查找的,返回 -1。 3. 计算中间元素的下标 mid,mid = (left + right) / 2。 4. 如果中间元素的等于要查找的,返回 mid。 5. 如果中间元素的大于要查找的,则在左半部分继续查找,将右边界缩小为 mid-1。 6. 如果中间元素的小于要查找的,则在右半部分继续查找,将左边界增大为 mid+1。 7. 重复执行步骤 2 - 6,直到找到要查找的组为空。 最终,我们可以在主函中调用该函输入要查找的,并输它在数组中的下标位置。 总的来说,折半查找是一种效率较高的查找算法,可以在很短的时间内找到数组中的目标元素。但是它有一个前提条件,就是组必须是排好序的。因此,在使用该算法时,我们必须注意先对进行排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值