#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;
}