-
#include
int main()
int i, j, n, k=0, isfound=0;
int num[15] = ;測試陣列。
printf("請輸出乙個整數:");
scanf("%d", &n);
i = (int)15/2;位移量。
j = (int)15/2;以“指標”的數量為例。
while(k<2)
i = (int)i/2;
if(i == 0) k++;i==0 表示當它對折不再摺疊時,仍然有最後的比較,所以 k 用作計數。
如果沒有,則計算下乙個迴圈指標的位置。
if(nnum[j])
j = j - i + 1);
elseisfound = 1;
break;如果找到相等的數字,則表示已找到標記並退出迴圈。
輸出結果。 if(isfound)
printf("此數字是陣列中 %d 元素的值", j);
elseprintf("沒有這樣的數字! ");
return 0;
-
VC 執行。
函式 10void f10()。
int i,j,n=15,m=0;
float a[15],k;
printf("這個函式是:將 15 個數字按從小到大的順序輸入到乙個陣列中。 輸入任意數字並使用半折搜尋方法(在半折中查詢)找到陣列中的位置。 如果不是,則輸出為“不在陣列中”。");
printf("請從小到大輸入15位數字:");
for(i=0;i<15;i++)
scanf("%f",&a[i]);
printf("請輸入任意數字:");
scanf("%f",&k);
printf("輸出為:");
j=n/2;
for(i=1;m==0;i++)
if(ka[n-1])
m=1; printf("該數字不在其陣列中");}else if(j<0||j>(n-1))m=1; printf("該數字不在其陣列中");}else if(k==a[j])
m=1;printf("此數字是陣列中的 %d 元素",j+1);}else if(ka[n/2])
j++;system("pause...");
對不起,我的錯了。
-
例如,排序後的資料為 1 5 12 35 64 78 89 123 456
如果要求12,先用12與上半部分9個數字中間的12<64進行比較,這樣你要找的資料就在前半部分,即1 5 12 35 64,然後用12和上半部分的中間數字(12)進行比較, 所以你可以在 2 次搜尋後找到它。
半折搜尋的目的是提高搜尋效率!
-
假設有 n 個數字被跟蹤公升序(這是關鍵! 返回組)。把它放在乙個一維陣列之前,如何找到你想要的數字?
顧名思義,二分法將一段數字分成兩半。
你想數進去它已經按公升序排列了將案例與中位數進行比較時,有 4 種情況:
為什麼發現數字x小於中間數後設定left=mid+1和right=mid-1??它不能是 left=mid 和 right=mid?
這涉及到如果有兩個中位數(例如,圖中第乙個迴圈的中位數是 ),那麼系統將自動選擇它們左的數字用作中間數字 (21)。
然後,當需要檢索時是最後的數字,最後只剩下兩個邊界,所以不管怎麼錯過橙子的中間數,左右邊界的範圍都不會改變,左邊的邊界仍然是左邊的邊界。 而你需要檢索的數字是右邊的邊界,即使這個數字確實大於中間的數字,但是由於演算法的原因,中間的數字永遠不會是正確的邊界,所以永遠找不到右邊邊界上的數字。
但是,如果設定為 left=mid+1 和 right=mid-1,則可以使左邊框 = 右邊框,中間數等於該數字,以便進行比較並找到它。
-
演算法思路:二進位搜尋的搜尋過程是首先確定搜尋記錄所在的範圍(間隔),然後逐漸縮小範圍,直到找到記錄或找不到記錄為止。
步驟如下:比較x和a之間的中間元素a[mid],如果x=a[mid],則x在l中的位置為mid;
如果 x,如果 x>a[mid],則 x 在 a[mid] 之後。
無論您查詢哪個部分,該方法都與在 A 中查詢 X 相同,但搜尋的大小減小了。 這說明,這個問題滿足了實行分而治之的第三個條件。