二分查找原理:
二分查找是在升序或者降序的情况下可以使用的查找方法。多次将查找数据和被查找数据段的中间数据比较,每次比较可以缩减一半的被查找数据段,极大的加快了查找速度。
代码思路:
1.先依次与数据段最左边arr(left)和最右边arr[right]的数据比较,若相等,则返回数组下标数字加一。不相等,则两者数组下标相加除二得到中间数组下标,即mid=(left+right)/2。
2.得到中间数组下标后,就可以得到中间值arr[mid],与中间值比较,若等于中间值,就返回中间值数组下标加一。若大于中间值,则左边数组下标变成中间值加一,即left=mid+1;右边数组下标自减一,即right=right-1;若小于中间值,则右边数组下标变成中间值减一,即right=mid-1;左边数组下标自加一,即left=left+1。
3.处理完步骤1与步骤2操作后,若未查找到数据,则用新得到的左边数组下标left与新得到的右边数组下标right再次进行步骤1与步骤2操作。发现也就是普通的嵌套操作
4.最后,思索如何确定数据段中没有这个数。由于是有序数据段,所以当数据大于最大值,小于最小值时,可以直接判定没有这个数。还有每一次进行步骤1与步骤2操作后,left与right都会进行相应的加减一,当left>right时,也可以直接判定没有这个数。
代码实现
所需头文件
#include "stdio.h"
冒泡排序(不清楚冒泡排序原理的欢迎在博主的空间里搜索了解一下)
void Bubble_Sort(int *arr,int sz)//冒泡排序
{
int i=0;
int j=0;
for (i = 0; i < sz-1; i++)
{
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int n = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = n;
}
}
}
}
二分查找实现(1)通俗版
int bin_search(int *arr, int left, int right, int aim) // arr 是查找的数组 left 数组的左
//下标 right 数组的右下标 aim 要查找的数字
{
if(left>right||aim > arr[right]|| aim < arr[left])//left>right时,当数据大于最大值,小
//于最小值时,可以直接判定没有这个数。
return -1;//返回-1表示没有这个数
int mid = (left + right) / 2;
if (aim == arr[left])
{
return left + 1;
}
else if (aim == arr[right])
{
return right + 1;
}
else
{
if (aim == arr[mid])
{
return mid + 1;
}
else if (aim > arr[mid])
{
bin_search(arr, mid + 1, right-1, aim);
}
else
{
bin_search(arr, left+1, mid + 1, aim);
}
}
}
二分查找实现(2)精简版
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while(left<=right)
{
mid = left+(right-left)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
return mid;//找到了,返回下标
}
return -1;//找不到
}
主函数
int main()
{
int str[10] = { 6,1,2,3,4,7,6,7,8,9 };//数据段无序,这里使用冒泡排序将数据排成有序数据段
int n = 0;
scanf("%d",&n);
int sz = sizeof(str)/ sizeof(int);
Bubble_Sort(str,sz);
int place = bin_search(str,0, sizeof(str)/sizeof(int) - 1, n);
if (place == -1)
printf("没有这个数");
else
printf("找到了,这个数在数据段的第%d个位置",place);
return 0;
}
整体代码
#include "stdio.h"
int bin_search(int *arr, int left, int right, int aim) // arr 是查找的数组 left 数组的左
//下标 right 数组的右下标 aim 要查找的数字
{
if(left>right||aim > arr[right]|| aim < arr[left])//left>right时,当数据大于最大值,小
//于最小值时,可以直接判定没有这个数。
return -1;//返回-1表示没有这个数
int mid = (left + right) / 2;
if (aim == arr[left])
{
return left + 1;
}
else if (aim == arr[right])
{
return right + 1;
}
else
{
if (aim == arr[mid])
{
return mid + 1;
}
else if (aim > arr[mid])
{
bin_search(arr, mid + 1, right-1, aim);
}
else
{
bin_search(arr, left+1, mid + 1, aim);
}
}
}
void Bubble_Sort(int *arr,int sz)//冒泡排序
{
int i=0;
int j=0;
for (i = 0; i < sz-1; i++)
{
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int n = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = n;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int str[10] = { 6,1,2,3,4,7,6,7,8,9 };//数据段无序,这里使用冒泡排序将数据排成有序数据段
int n = 0;
scanf("%d",&n);
int sz = sizeof(str)/ sizeof(int);
Bubble_Sort(str,sz);
int place = bin_search(str,0, sizeof(str)/sizeof(int) - 1, n);
if (place == -1)
printf("没有这个数");
else
printf("找到了,这个数在数据段的第%d个位置",place);
return 0;
}