day 2 二分法学习

#include<stdio.h>
#include <time.h>
#include <cstdlib>
#include <string.h>
#include<vector>
#include<string> 

int mid;
int main()
{
	int a[10] = { 0 };
	printf("请输入10个数: \n");
	for (int i = 0; i < 10; i++)
	{
		scanf_s("%d", &a[i]);
	}


	//排列(插入法,从小到大排序)
	for (int i = 1; i < 10; i++)
	{
		int t = a[i];
		int j = i - 1;
		while (j >= 0 && a[j] > t)
		{
			a[j + 1] = a[j];
			a[j] = t;
			j--;
		}
	}
	//输出一下
	printf("排序后的结果是:");
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");


	//二分法查找
	int target;
	printf("您要查找什么数字: ");
	scanf_s("%d", &target);

	int low = 0, high = 9;
	while (low <= high)
	{
	    mid = (low + high) / 2;
		if (a[mid] == target)
		{
			break;
		}
		else if (a[mid] < target)  //元素在数组的左半边,新数组的起点位于中间元素的下一个元素
		{
			low = mid + 1;
		}
		else
		{
			high = mid - 1;   //元素在数组的左半边,新数组的终点位于中间元素的前一个元素
		}
	}

	if (low <= high)
	{
		printf("该元素在数组内,且位于%d的位置上\n",mid);
	}
	else
	{
		printf("该元素不在数组内,且位于%d的位置上\n",mid);
	}
	return 0;
}

%%%%%%%%%%%%%
%脑残版


#include<stdio.h>
#include <time.h>
#include <cstdlib>
#include <string.h>
#include<vector>
#include<string> 

//二分法查找的应用,对于有序的数组的查找

//思路:是否可以通过定义两个动态数组,实时改变以及存储两个数组的数据以及改变数组的尺寸
int main()
{
	int* nums = NULL;
	int number;
	int target, half_len,num_size;


	printf("how much number do you want to enter:");
	scanf_s("%d", &num_size);

	nums = (int*)malloc(num_size * sizeof(int));

	//键盘输入每一个数值
	printf("enter these number orderly........\n");
	for (int i = 1; i <= num_size; i++)
	{
		printf("enter %d number:",i);
		scanf_s("%d", &nums[i-1]);
	}


	half_len = num_size;
	printf("enter the number you want to search: ");
	scanf_s("%d", &target);


	int break_or_not = 0; 
	while (half_len >= 1)
	{
		//temp1,temp2分别存储二分法的前半部分和后半部分,new_array用来存储符合条件的那一半数组,作为下一次二分的基础
		int* temp1 = NULL, * temp2 = NULL, * new_array = NULL;
		temp1 = (int*)malloc(half_len * sizeof(int));
		temp2 = (int*)malloc(half_len * sizeof(int));

		new_array = (int*)malloc(half_len * sizeof(int));

		//将数组二分

		for (int i = 0; i < half_len/2; i++)
		{
			temp1[i] = nums[i];
			//分数组是奇数还是偶数,如果是偶数,直接二等分,如果是奇数,除了索引上的区别还要对中间那个数进行判别
			//按理来说,如果数组是奇数个,whlie循环只有第一个循环需要进行这个判断,因为第一轮判断之后所形成的数组都是偶数个
			//所以如果数组是奇数个且中间那个数刚好等于要找的那个数,那么就直接判断找到了这个数且直接跳出while循环
			//if (counter == 1)    //这里是为了处理第一次输入,第一次输入如果是奇数,在进入while循环之前由于
			//	                 //half_len = num_size / 2; 就已经损失掉了1个数值,这里的奇偶性应该直接用输入的最原始的数组的尺寸来
			//{
			if (half_len % 2 == 0)
				temp2[i] = nums[i + half_len / 2];
			else if (half_len == 1)    //该条件成立,无论是否在数组里面找到了成立的数,循环都终止
			{
				break_or_not == 1;
				if (nums[0] == target)
					printf("%d 存在于nums", target);
				else
					printf("%d 不存在于nums", target);
				break;
			}

			else
				if (nums[half_len / 2] == target)  //该条件成立,表示奇数个数组的中间那个数满足条件,已经找到了要找的,直接结束循环
				{
					break_or_not == 1;
					printf("%d 存在于nums", target);
					break;
				}
				else
					temp2[i] = nums[i + half_len / 2 + 1];


		}
		free(nums);


		if (break_or_not != 1)
		{
			half_len = half_len / 2;
			if (half_len != 1)
			{
				//判断所查找的数是在前半部分还是后半部分,
				if (temp1[half_len] > target)
				{
					for (int i = 0; i < half_len; i++)
					{
						new_array[i] = temp1[i];
					}
				}
				else
				{
					for (int i = 0; i < half_len; i++)
					{
						new_array[i] = temp2[i];
					}
				}

				//判断数组的长度是否为1,如果数组长度是1且此时的数组内的位移一个数是否等于要查找的那个数,
				//是,则说明找到了,不是则说明这个数不在这个数组里,所以数组长度为1就是循环的停止条件
				int* nums = NULL;
				nums = (int*)malloc(half_len * sizeof(int));
				for (int i = 0; i < half_len; i++)
				{
					nums[i] = new_array[i];
				}


				free(temp1);
				free(temp2);
				free(new_array);

				if (half_len == 1)
				{
					if (nums[0] == target || nums[1] == target)
					{
						printf("%d 存在于nums", target);
					}
					else
					{
						printf("%d 不存在于nums", target);
					}
				}
			}
			else
			{
				if (temp1[0] == target || temp2[0] == target)
				{
					printf("%d 存在于nums", target);
				}
				else
				{
					printf("%d 不存在于nums", target);
				}
				free(temp1);
				free(temp2);
				break_or_not = 1;
				break;
			}
			
		}
		else
		{
			break;
		}

	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值