二分查詢法(暴力拆解法)
阿新 • • 發佈:2021-01-23
概念
二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。 [百度知道]
分析
1,通過三個數來查詢,開始值(低位置),中間值(mid),末尾值(高位置),下文分別稱low位置,mid值,high位置
2,用你想查詢的key值做比較,
如果key值大於mid值,就把mid值當成開始值(即把mid值賦值給low位置),繼續求平均值,繼續跟提供的值做比較
如果是小於中間值那麼舊把末尾值變成中間值的位置,繼續剛剛的操作,
(如果看不明白,程式碼裡有詳細的分部詳解)
3,二分查詢法相較於冒泡和遞迴來說效率高很多,但缺點也顯而易見,如果陣列中有重複的數字,程式就崩潰了。(因為只能返回一個下標)
例項
例如查詢陣列{5,13,19,21,37,56,64,75,80,88,92}中21的下標
1, 先確定low,mid,high的位置(注意這幾個都是下標)
mid=(high+low)/2
2, 用mid位置的值與21比較,21<56
3, 令mid=high-1;(減1的原因是已經知道56不等於21,就可以直接跳到前一個位置,提高效率)
4,此時low指向5,high指向37,再算出mid=(high+low)/2,得到mid指向19,
5,用21和此時的mid值作比較,21>19,
6,所以令mid=low+1;(加1為提高效率)
7,在比較就得到mid = low = 21 了 ,就是下圖這樣
程式碼
#include<stdio.h>
void main()
{
int ar[] = { 1, 23, 45, 65, 76, 87, 445, 77765, 34535, 234222, 999999 };
int n = sizeof(ar) / sizeof(ar[0]);
int key;
printf("請輸入要查詢的key值:>");
scanf("%d",&key);
int low = 0;
int high = n - 1; //高位置例如999999他的下標是10,而n為11,則高位置應該等於最後一個數字的下標即n-1
int mid, index = -1; //index是一個索引,初始化為-1沒有什麼意義,後面用作結果輸出
while (low <= high)
{
mid = (low + high) / 2;
if (key == ar[mid])
{
index = mid;
break;
}
else if (key < ar[mid])
{
high = mid - 1;
}
else
low = mid + 1;
}
if (index == -1)
printf("要查詢的%d不存在。。。\n",key);
else
printf("要查詢的%d的下標為%d",key,index);
//
//二分查詢(有序的) 前提是陣列有序!!!
// low位置,mid位置,high位置,key值, (前三個都是下標,key是真值,注意ar[low]和low的區別)
//開始查詢
// mid = (low + high)/2 ;
// if(ar[mid]==key) -->查詢成功,輸出key值=mid值=……
// if(ar[mid]< key) -->令mid=high+1,繼續查詢(再迴圈)
// if(ar[mid]> key) -->令mid=low-1, 繼續查詢(再迴圈)//-1沒有其實也可以,但是有了會提高效率
///
}