#include<stdio.h>
#define MAXSIZE 30
typedef struct
{
int key;//int爲關鍵字key的數據類型
char data;//其他數據
}SeqList;//順序表元素類型
int BinSearch(SeqList R[],int n,int k)//折半查找(二分)
{
int low=0,high=n-1,mid;
while(low<=high)//查找區間最左記錄的位置low小於等於最右記錄的位置high
{
mid=(low+high)/2;//mid取該查找區間的中間的記錄位置
if(R[mid].key==k)//當中間關鍵字和k相同時
return mid;//查找成功
else
if(R[mid].key>k)
high=mid-1;//繼續在R[low]~R[mid-1]中查找
else
low=mid+1;//繼續在R[mid+1]~R[high]
}
return -1;//查找失敗
}
int main()
{
int i,n,k;
SeqList R[MAXSIZE];
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
R[i].key=i;
scanf("%d",&k);
i=BinSearch(R,n,k);//在順序表中查找關鍵字爲k的記錄
if(i!=-1)
printf("Position of %d in SeqList is %d !\n",k,i);
else
printf("No found %d in SeqList!\n",k);
}
}
/*
測試數據
5
2
5
6
*/
改編題:
設a[0:n-1]是已排好的數組。請改寫二分搜索算法,使得當搜索元素x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素j。當搜索元素在數組中時,i和j相同,均爲x在數組中的位置。
算法:
#include<stdio.h>
#define MAXSIZE 1024
typedef struct
{
int key;
char data;
}SeqList;
int BinarySearch(SeqList a[],int x,int n)
{
int left=0;int right=n-1;
int i,j;
while(left <=right){
int middle=(left+right)/2;
// printf("%d\n",middle);
if(x==a[middle].key)
{
i=j=middle;
printf("%d %d %d\n",i,j,middle);
return 1;
}
if(x>a[middle].key)
left=middle+1;
else
right=middle-1;
}
i=right;j=left;
printf("%d %d\n",i,j);
return 0;
}
int scanf1(SeqList R[],int n)
{
int i,j;
for(i<0;i<=n;i++)
{
R[i].key=i;
printf("%d ",i);
}
printf("\n");
}
int main()
{
SeqList R[MAXSIZE];
int n,x,i;
scanf("%d",&n);
scanf1(R,n);
while(scanf("%d",&x)!=EOF)
{
BinarySearch(R,x,n);
}
}
下面七個算法與本章的二分搜索算法BinarySearch略有不同。請判斷這七個算法的正確性,如算法不正確,請說明原因。如果算法正確,請給出算法的正確性證明。
解:
(1) 算法陷入死循環,數組的left和right的調整不正確。
(2) 程序返回結果出錯,數組的left和right調整不正確,導致當x=a[n-1]時返回錯誤。
(3) 數組的left和right調整不正確,導致當x=a[n-1]時返回錯誤。當查找的數爲最後一個數時,程序返回不正確。
(4) 數組的left和right的調整不正確。
(5) 算法正確。通過測試算法,發現程序的返回值正確。
(6) 數組的left與right調整不正確,導致當x=a[n-1]時返回錯誤。
(7) 程序陷入死循環,left和right調整不正確。