本題要求實現二分查找算法。html
Position BinarySearch( List L, ElementType X );
其中List
結構定義以下:算法
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存線性表中最後一個元素的位置 */ };
L
是用戶傳入的一個線性表,其中ElementType
元素能夠經過>、==、<進行比較,而且題目保證傳入的數據是遞增有序的。函數BinarySearch
要查找X
在Data
中的位置,即數組下標(注意:元素從下標1開始存儲)。找到則返回下標,不然返回一個特殊的失敗標記NotFound
。數組
#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(); scanf("%d", &X); P = BinarySearch( L, X ); printf("%d\n", P); return 0; } /* 你的代碼將被嵌在這裏 */
5 12 31 55 89 101 31
2
3 26 78 233 31
0
本題的思路:函數
按照題目所給的接口,寫一個二分算法就好了,必定要注意的是L 是一個指針測試
ac代碼以下:spa
Position BinarySearch( List L, ElementType X ) { Position l = 1, r = L->Last, mid; while (r - l >= 0) { mid = (l + r) / 2; if (L->Data[mid] > X) // 中間位置的數大於要查找的數,那麼在中間數的左區間找 r = mid - 1; else if (L->Data[mid] == X) return mid; else // 中間位置的數小於要查找的數,那麼在中間數的右區間找 l = mid + 1; } return NotFound; }