整体思路是:
1.创建一个数组,利用随机函数进行初始化数组。
2.将数组内的函数排序(快速排序)
3.键入一个需要查找的数,使用二分查找这个数,若存在里面则输出存在,打印下标。
注:并不是把所有满足的数都找到,而是找到一个以后就立刻打印下表(只找一个)
#define _CRT_SECURE_NO_WARNINGS 1
//利用随机函数初始化一个数组,然后排序,自己键入一个数,在数组中查找这个数,如果找到,返回这个数的下标(只返回一个)。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>//使用rand()函数,这里有一个疑问,为什么将此处的头文件换成windows.h也不会报错
//初始化数组
void init(int arr[],int len,int range)
{
srand((unsigned)time(NULL));
for (int i = 0; i < len; i++)
{
arr[i] = 1 + rand()%range;//产生1-10000之间的随机数,用来初始化数组arr
}
}
//快速排序
void quickSort(int a[], int left, int right)
{
if (left < right)//递归条件,不满足则退出
{
int l = left, r = right;
int pivot = a[left];
for (; l < r;)
{
for (; l < r && a[r] >= pivot; r--);
if (l < r && a[r] < pivot)
{
a[l] = a[r];
l++;
}
for (; l < r && a[l] <= pivot; l++);
if (l<r && a[l]>pivot)
{
a[r] = a[l];
r--;
}
}
a[l] = pivot;
quickSort(a, left, l - 1);
quickSort(a, l + 1, right);
}
}
//打印数组所有元素,传入数组名和数组长度
void print_arr(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
if (i % 10 == 0) printf("\n");//十个一行输出
printf("%d\t", arr[i]);
}
printf("\n");
}
//寻找数组中是否有输入的数字
void match(int n,int arr[],int len)//找的数字,数组名,数组长
{
int left = 0;
int right = len - 1;
while (left<=right)//left会逐渐增加,right会逐渐减小,
{
int mid = (left + right) / 2;
if (arr[mid] > n)//那么找的数字一定不在[mid,right]之间,可能会在[left,mid-1]之间
{
right = mid - 1;//保证只有可能在[left,right]中找到
}
else if (arr[mid] < n)//要找的数字一定不在[left,mid]之间,可能在[mid+1,right]之间
{
left = mid + 1;//保证只有可能在[left,right]中找到
}
else//说明arr[mid]==n了
{
printf("在下标%d的地方找到这个数\n", mid);
break;//找到后就该跳出,读者可以尝试下去掉break,看下运行结果
}
}
if (left > right)//说明[left,right]这个区间已经不存在了,也就是找不到这个数
{
printf("数组中没有这个数\n");
}
}
int main()
{
int arr[100];
int len = sizeof(arr) / sizeof(arr[0]);
int range = 100;//数组在1-range里面选数字
init(arr, len,range);//随机数初始化一下数组
quickSort(arr, 0, len - 1);//给数组排个序
print_arr(arr,len);//把数组打印一下
printf("请输入要查找的数:");
int n = 0;
scanf("%d", &n);
match(n,arr,len);
return 0;
}
对于我本人来说需要重点捋清楚的就是match()函数内while的循环条件为什么是(left<right);
若输入的数字没在数组里面,随着循环不断进行,left逐渐增加,right逐渐减少,会达到left=right;
进入下一次循环后会发生left++或者right--,无论发生哪一种,都会产生left>right;也就是[left,right]这个区间不存在了,所以不可能找到匹配.循环结束。
在循环外面加入left和right的比较就能知道,循环是break退出的还是,由于不满足循环条件退出的.