線性查找就是把要查找的關鍵字與數組中的元素逐個進行比較來進行查找;
而對於有序排列的數組而言,折半查找把要查找的關鍵字先與數組中間的元素進行比較,如果相同就可以結束查找;如果不同的話,比較關鍵字和中間元素的大小,關鍵字大於中間元素的話就在數組後半邊查找,小於中間元素的話就在數組前半邊查找。
線性查找適合於規模較小的數組或者無序排列的數組。對於有序排列的大規模數組而言用線性查找的方法可能非常慢。
舉例而言,有個有序排列的數組,從1到2047有元素個數2047,我們採用折半查找,最壞的情況只需要進行11次比較。因爲我們先和(1+2047)/2=1024比較,再和(1023+1)/2=512比較,再和256、128、64、32、16、8、4、2、1比較。而如果我們用線性查找的話,最壞情況下需要比較2047次。數量再大一些,這兩種方法的差距就會更大。有2的n次方減一個元素,線性方法就要比較2的n次方減一次,而折半查找只需要n次。
下面是一個利用折半查找法的例子:
#include<stdio.h>
#define SIZE 15/*定義數組的大小*/
int binary(const int a[],int searchKey,int low,int high);/*折半查找*/
void guocheng(const int a[],int low,int mid,int high);/*打印每次查找的子數組,並把中間值後面用*標記*/
int main(void)
{
int a[SIZE];
int i;
int key;
int result;
for (i=0;i<SIZE;i++)
{
a[i]=2*i;
}
printf("請輸入一個數字(0~%d)",(SIZE-1)*2);
scanf("%d",&key);
printf("元素號爲:\n");
for(int i=0;i<SIZE;i++)
{
printf("%3d ",i);
}
printf("\n");
for (int i=1;i<=SIZE;i++)
{
printf("___ ");
}
printf("\n");
result=binary(a,key,0,SIZE-1);
if(result==-1)
{
printf("找不到%d",key);
}
else
{
printf("在位置%d處找到%d",result,key);
}
}
int binary(const int a[],int searchKey,int low,int high)
{
int mid;
while(low<=high)
{
mid=(low+high)/2;
guocheng(a,low,mid,high);
if (searchKey==a[mid])
{
return mid;/*在數組中找到了關鍵字,就返回mid值*/
}
else if(searchKey!=a[mid])
{
if (searchKey>a[mid] )
{
low=mid+1;
}
else
{
high=mid-1;
}
}
}
return -1;/*在數組中沒找打這個關鍵字,就返回-1*/
}
void guocheng(const int a[],int low,int mid,int high)
{
for (int i=0;i<SIZE;i++)
{
if(i<low||i>high)
{
printf(" ");
}
else if(i==mid)
{
printf("%3d*",a[i]);
}
else
{
printf("%3d ",a[i]);
}
}
printf("\n");
}