折半查詢演算法的使用

2021-09-02 23:54:39 字數 3050 閱讀 8948

維基上的**:

int binary_search(int a, int key, int imin, int imax)

// key was not found

return key_not_found;

}

評估下面兩個演算法:

int binary_search()

; size = sizeof(words) / sizeof(words[0]);

printf("第乙個演算法 sizeof = %d\n", size);

int head = 0;

int tail = size;

int cursor = (head + tail) / 2;

int result = 999;

int count = 0;

printf("keys= \"%s\"\n", keys);

printf("words[i] = \n");

for (int i = 0; i < size; ++i) printf("[%d]=\"%s\" ", i, words[i]);

doelse if (result < 0)

else

cursor = (head + tail) / 2;

}while((head < cursor) && (cursor <= tail)); //((head <= cursor) && (cursor < tail))

printf("\n------------------\ncursor = %d head = %d , tail = %d , \n", cursor, head, tail);

printf("words[%d] = \"%s\" , result = %d \n\n", cursor, words[cursor], result);

printf("********************\n");

int left = 0, right = size - 1, middle = 0; //, result = 0;

count = 0;

printf("第二個演算法 sizeof = %d\n", size);

printf("keys= \"%s\"\n", keys);

printf("words[i] = \n");

for (int i = 0; i < size; ++i) printf("[%d]=\"%s\" ", i, words[i]);

printf("\nmiddle = %d, left = %d , right = %d , \n", middle, left, right);

while (left <= right)

else if (result < 0) right = middle - 1;

else break;

} printf("---------------------\nmiddle = %d, left = %d , right = %d , \n", middle, left, right);

printf("words[%d] = \"%s\" , result = %d \n ", middle , words[middle], result);

return cursor;

}

程式結果:

第乙個演算法 sizeof = 12

keys= "11"

words[i] =

[0]="1" [1]="2" [2]="21" [3]="22" [4]="222" [5]="3" [6]="5" [7]="66" [8]="90" [9]="900" [10]="91" [11]="929"

count = 0  cursor = 6 head = 0 , tail = 12 ,

words[6] = "5" , result = -1

count = 1  cursor = 3 head = 0 , tail = 6 ,

words[3] = "22" , result = -1

count = 2  cursor = 1 head = 0 , tail = 3 ,

words[1] = "2" , result = -1

------------------

cursor = 0 head = 0 , tail = 1 ,

words[0] = "1" , result = -1

********************

第二個演算法 sizeof = 12

keys= "11"

words[i] =

[0]="1" [1]="2" [2]="21" [3]="22" [4]="222" [5]="3" [6]="5" [7]="66" [8]="90" [9

]="900" [10]="91" [11]="929"

middle = 0, left = 0 , right = 11 ,

count = 0 middle = 5, left = 0 , right = 11 ,

words[5] = "3" , result = -1

count = 1 middle = 2, left = 0 , right = 4 ,

words[2] = "21" , result = -1

count = 2 middle = 0, left = 0 , right = 1 ,

words[0] = "1" , result = 1

count = 3 middle = 1, left = 1 , right = 1 ,

words[1] = "2" , result = -1

---------------------

middle = 1, left = 1 , right = 0 ,

words[1] = "2" , result = -1

請按任意鍵繼續. . .

當搜尋失敗的時候,「中間點」停留在**呢?能否停留在「最近似」的乙個位置?忙於工作,有機會再研究。

查詢演算法 折半查詢演算法

折半查詢演算法 binary search param a 乙個有序的集合 本次為由小到大 param x 需要查詢的值 ps 首先使用折半演算法的時候 集合必須是有序的 eg a 1,3,5,7,9 x 3 a mid low height 1,3,5,7,9 2 0 1 1,3 0 1 1 3 ...

查詢演算法 折半查詢

本小節知識點 1.掌握 基本思路 2.掌握 實現步驟 3.了解 練習 1.基本思路 在有序表中,取中間元素作為比較物件,若給定值與中間元素的要查詢的數相等,則查詢成功 若給定值小於中間元素的要查詢的數,則在中間元素的左半區繼續查詢 若給定值大於中間元素的要查詢的數,則在中間元素的右半區繼續查詢。不斷...

折半查詢演算法

折半查詢法 從表列中查乙個數最簡單的方法是從第1個數開始順序查詢,將要找的數與表列中的 數一一比較,直到找到為止 如果表列中無此數,則應找到最後乙個數,然後判定 找不到 但這種 順序查詢法 效率較低。如果表列中有1000個數,且要找的數恰恰是第1000個數,則要進行1000次比較才得到結果。平均比較...