數據結構-查找(C語言)——折半(二分)查找代碼篇

#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調整不正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章