C语言
二分查找法
所谓的二分查找法,其实是一种有序的查找方法,也称折半查找(Binary Search),如果是无序的则要先进行排序操作。基本思想是:目标值通过与中间元素比较,可分为三种情况:
第一种情况:目标值与中间元素相等,查找结束;
第二种情况:目标值比中间元素大,则把后半部分的中间元素与目标值比较;
第二种情况:目标值比中间元素小,则把前半部分的中间元素与目标值比较;
这三步一直循环,直到查找结束。
由于数组顺序可能未经过排序,所以使用了希尔排序算法进行排序,再进行查找;
程序如下:
#include <stdio.h>
int BinarySearch(int *nums, int numsSize, int target);
int BinarySearchRecursive(int *nums, int first, int last, int target);
int ShellSort(int *nums, int n);
// 进行插入排序
// 初始时从dk开始增长,每次比较步长为dk
int Insrtsort(int *a, int n, int dk)
{
for (int i = dk; i < n; ++i)
{
int j = i - dk;
if (a[i] < a[j])
{ // 比较前后数字大小
int tmp = a[i]; // 作为临时存储
a[i] = a[j];
while (a[j] > tmp)
{ // 寻找tmp的插入位置
a[j + dk] = a[j];
j -= dk;
}
a[j + dk] = tmp; // 插入tmp
}
}
}
// 希尔排序
int ShellSort(int *nums, int n)
{
int dk = n / 2; // 设置初始dk
while (dk >= 1)
{
Insrtsort(nums, n, dk);
dk /= 2;
}
}
int main(int argc, char const *argv[])
{
int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 10};
int n = sizeof(num) / sizeof(int);
// 有可能数组是乱序的,所以需要先排序
// 希尔排序算法
ShellSort(num, n);
// 非递归二分查询
// int flag = BinarySearch(num, n, 4);
// 递归二分查询 lg(N)
int flag = BinarySearchRecursive(num, 0, n, 4);
if (flag == -1)
printf("无该数字!!\n");
else
printf("已经找到该数字!!\n%d\n", flag);
return 0;
}
// 非递归二分查询
int BinarySearch(int *nums, int numsSize, int target)
{
int first = 0, last = numsSize - 1, mid;
while (first <= last)
{
// 防溢出 >> 右移 相当于 / 2
int mid = (first + last) >> 1;
if (nums[mid] == target)
{
return mid;
}
else if (nums[mid] > target)
{
last = mid - 1;
}
else if (nums[mid] < target)
{
first = mid + 1;
}
}
return (-1);
}
// 递归二分查询 lg(N)
int BinarySearchRecursive(int *nums, int first, int last, int target)
{
if (first > last)
return -1;
int mid = (first + last) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
return BinarySearchRecursive(nums, mid + 1, last, target);
else
return BinarySearchRecursive(nums, first, mid - 1, target);
}
运行程序,结果如下: