C语言中的查找算法
c语言中的查找算法主要应用与数组类型,主要分为顺序查找和二分查找,下面我就这两种算法展开讨论:
一、顺序查找算法
顺序查找算法,顾名思义就是通过迭代,按照顺序对将查找信息和查找数据块进行一一查询,是一种简单但是低效的查找方式;
#include "stdio.h"
#define N 10
int Search(int a[], int x, int n);
int main()
{
int num, result;
int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("Please input you want to find number:");
scanf("%d", &num);
result = Search(a, num, N);
printf("%d\n", result);
return 0;
}
int Search(int a[], int x, int n)
{
int i;
for(i=0;i<n;i++)
{
if(a[i] == x)
{
return i; //一定要将整个数组进行迭代;
}
}
return -1;
}
二、二分查找算法
二分查找算法,也叫做折半查找。相对于顺序查找速度要快很多。折半查找的基本思想为:首先选取数组的中间元素,将其与查找键进行比较,如果他们的值相等,则查找键被找到,返回数组中元素的位置;否则,将查找的区间缩小为原来的一半,即一般的数组元素中查找。
二分查找算法要结合排序算法一起使用,这样经过排序的数组,才能更好地应用二分查找算法;
#include "stdio.h"
#define N 10
int Search(int a[], int x, int n);
void Sort(int a[], int n);
int main()
{
int num, result;
int i;
int a[N] = {18, 24, 3, 53, 62, 12, 14, 12, 78, 54};
printf("Please input you want to find number:");
scanf("%d", &num);
Sort(a, N);
result = Search(a, num, N);
if(result >= 0)
{
printf("Find successedly!\npos:%d", result);
}
else
{
printf("Find failly!");
}
return 0;
}
void Sort(int a[], int n) //先对数组进行升序排序;
{
int i, j;
int temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[j] < a[i])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
int Search(int a[], int x, int n) //利用二分搜索算法
{
int mid, start = 0, end = n-1;
while(start <= end)
{
mid = (start + end) / 2;
if(x > a[mid])
{
start = mid + 1;
}
if(x < a[mid])
{
end = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
结果是:
Please input you want to find number:12(输入)
Find successedly!(输出)
pos:1
还可以运用标记变量的办法编写折半查找算法
#include "stdio.h"
#define N 10
int Search(int a[], int x, int n);
void Sort(int a[], int n);
int main()
{
int num, result;
int i;
int a[N] = {18, 24, 3, 53, 62, 12, 14, 12, 78, 54};
printf("Please input you want to find number:");
scanf("%d", &num);
Sort(a, N);
result = Search(a, num, N);
if(result >= 0)
{
printf("Find successedly!\npos:%d", result);
}
else
{
printf("Find failly!");
}
return 0;
}
void Sort(int a[], int n)
{
int i, j;
int temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[j] < a[i])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
int Search(int a[], int x, int n)
{
int low = 0, high = n -1, mid;
int pos = -1;
int find = 0;
while(!find && low <= high) //运用标记法进行条件判断;
{
mid = (high + low) / 2;
if(x > a[mid])
{
low = mid + 1;
}
if(x < a[mid])
{
high = mid - 1;
}
else
{
pos = mid;
find = 1; //找到之后,将标记赋值为1;
}
}
return pos;
}
结果是:
Please input you want to find number:12(输入)
Find successedly!(输出)
pos:1
注意:
有的时候high+low的值会超出limit中定义的有符号整数的极限,那么执行mid = (high + low) / 2就会产生溢出,所以呢,以防万一,我们所要做的就是用减法来算:mid = low + (high - low) / 2;