二分法
#include <stdio.h>
#include <stdlib.h>
#define N 20
int main(void)
{
int num[N]; //定义一个足够长的数组
int n; //定义数组元素个数
int i, j, temp; //循环变量和排序需要的临时变量
int left; //定义元素最小下标
int right; //定义元素最大下标
int mid; //定义中值的下标
int searchNum; //定义需要查找的数字
printf("请输入数组元素个数:");
scanf_s("%d", &n);
for (i = 0; i < n; i++)
{
scanf_s("%d", (num + i));
}
printf("排序后的数组为:\n");
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (num[j] > num[j + 1])
{
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
for (i = 0; i < n; i++)
{
printf("%d\t", num[i]);
}
printf("\n");
left = 0; //最左边元素的下标
right = n - 1; //最右边元素的下标
printf("请输入要查找的数字:");
scanf_s("%d", &searchNum);
while (1) //无限重复循环直到碰上一个break才结束
{
mid = (left + right) / 2; //取数组中间元素的下标
if (num[mid] == searchNum)
{
printf("需要查找的数是第%d个元素。", mid + 1);
break;
}
else if (searchNum > num[mid] && searchNum <= num[right])
{
left = mid + 1; //移动最左边的下标,向中间下标靠拢
}
else if (searchNum < num[mid] && searchNum >= num[left])
{
right = mid - 1; //移动最右边的下标,向中间下标靠拢
}
else
{
printf("数组中没有你要找的元素");
break;
}
}
system("pause");
return 0;
}
注意整段代码中最核心的部分即是数组元素下标的变化,将一个数组按大小排序后,若要对数组查找数字,则需不断通过下标中值找到下标中值所对应的元素并判断要找的数与中值的关系,最后输出结果,注意最后mid + 1输出的是要查找的数字是第几个数组元素。