凜冬之翼---二分查詢
阿新 • • 發佈:2018-12-30
昨天體側來著,今天睡了一個好覺,下午來理學樓開始寫程式碼,精神狀態很好,爭取多寫幾個poject哦!
題目:L是使用者傳入的一個線性表,其中ElementType元素可以通過>、==、<進行比較,並且題目保證傳入的資料是遞增有序的。函式BinarySearch要查詢X在Data中的位置,即陣列下標(注意:元素從下標1開始儲存)。找到則返回下標,否則返回一個特殊的失敗標記NotFound。
具體題目百度關鍵字:01-複雜度3 二分查詢
解題思路:主要是一般二分查詢的思路,但是要注意在while迴圈的時候迴圈次數的取值一般區(N/2)N是總數。
遇到的問題:1.在for()後面多打了一個;號導致的錯誤很難找到。
2.在執行程式碼的時候電腦管家自作聰明的把我的程式碼當作木馬病毒給清除了,真是傻,以後再執行的時候記得
關掉電腦管家。
3.提交的是程式碼片段和我自己寫的程式碼資料結構有所不同,注意更改格式。
程式碼:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 儲存線性表中最後一個元素的位置 */
};
List ReadInput(); /* 裁判實現,細節不表。元素從下標1開始儲存 */
Position BinarySearch( List L, ElementType X );
int main()
{
List L;
ElementType X;
Position P;
L = ReadInput();
// printf("%d",L->Last);
// printf("%d",L->Data[L->Last]);
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);
return 0;
}
List ReadInput (){
int x,i;
List p=(List)malloc(sizeof(LNode));
scanf("%d",&x);
getchar();
for(i=0;i<x;i++){
scanf("%d",&p->Data[i]);
}
p->Last=x-1;
return p;
}
Position BinarySearch( List L, ElementType X ){
int num,mid,first,last,p=-1;
first=0;
last=L->Last;
// printf("%d",last);
num=last/2;
while(num--){
mid=(first+last)/2;
// printf("%d",mid);
if(L->Data[first]==X){
p=first;
break;
}
if(L->Data[last]==X){
p=last;
break;
}
if(L->Data[mid]==X){
p=mid;
break;
}
if(L->Data[mid]>X){
last=mid;
}
if(L->Data[mid]<X){
first=mid;
}
}
if(p==-1)
return NotFound;
else
return p+1;
}