二分法查找元素时,数组中的元素排序要为升序,所以对于无序的数组要先进行冒泡排序
#include<stdio.h>
int main()
{
int sz = 0, right = 0, left = 0, i = 0, j = 0;
int arr[] = { 4,6,2,8,1,3,9,0,5,7 };
sz = sizeof(arr) / sizeof(arr[0]); //元素的个数
for (i = 0; i < sz - 1; i++) //先用冒泡排序将数组中的元素从小到大排列
{
for (j = 0; j < sz - i - 1; j++)
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
非函数法
#include<stdio.h>
int main()
{
int sz = 0, right = 0, left = 0, i = 0, j = 0;
int arr[] = { 4,6,2,8,1,3,9,0,5,7 };
sz = sizeof(arr) / sizeof(arr[0]); //元素的个数
for (i = 0; i < sz - 1; i++) //先用冒泡排序将数组中的元素从小到大排列
{
for (j = 0; j < sz - i - 1; j++)
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
right = sz - 1;
int n;
printf("请输入要找的数字->");
scanf("%d", &n);
while (left <= right)
{
int mid = (left + right) / 2;
if (n < arr[mid])
{
right = mid - 1;
}
else if (n > arr[mid])
{
left = mid + 1;
}
else
{
printf("找到了,下标是: %d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到");
}
return 0;
}
函数法
当我们在写函数时,函数内部最好不要有printf语句,要让函数有一种特定的功能
int find_element(int arr[], int sz, int n)
{
int right = 0, left = 0;
right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (n < arr[mid])
{
right = mid - 1;
}
else if (n > arr[mid])
{
left = mid + 1;
}
else
{
return mid; //返回mid而不是打印
}
}
if (left > right)
{
return -1;
}
}
int main()
{
int sz = 0, right = 0, left = 0, i = 0, j = 0;
int arr[] = { 4,6,2,8,1,3,9,0,5,7 };
sz = sizeof(arr) / sizeof(arr[0]); //元素的个数
for (i = 0; i < sz - 1; i++) //先用冒泡排序将数组中的元素从小到大排列
{
for (j = 0; j < sz - i - 1; j++)
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
right = sz - 1;
int n;
printf("请输入要找的数字->");
scanf("%d", &n);
int flag = 0;
flag = find_element(arr, sz, n);
if (flag == -1)
printf("没找到");
else
printf("找到了,下标为 %d\n", flag);
return 0;
}