C 折半查詢的基本思想和步驟,C 折半查詢法

2022-02-21 20:30:53 字數 5221 閱讀 6530

1樓:佛系執著

折半查詢法是效率較高的一種查詢方法。

基本思想是:設查詢資料的範圍下限為l=0,上限為h=4,求中點m=(l+h)/2,用x與中點元素am比較,若x等於am,即找到,停止查詢;

否則,若x大於am,替換下限l=m+1,到下半段繼續查詢;若x小於am,換上限h=m-1,到上半段繼續查詢;

如此重複前面的過程直到找到或者l>h為止。如果l>h,說明沒有此數,列印找不到資訊,程式結束。

步驟:1、首先確定整個查詢區間的中間位置 mid=( left + right) /2 。

2、用待查關鍵字值與中間位置的關鍵字值進行比較;若相等,則查詢成功,若大於,則在後(右)半個區域繼續進行折半查詢,若小於,則在前(左)半個區域繼續進行折半查詢。

3、對確定的縮小區域再按折半公式,重複上述步驟。最後得到結果:要麼查詢成功,要麼查詢失敗。折半查詢的儲存結構採用一維陣列存放。

擴充套件資料

折半查詢法的優點:比較次數少,查詢速度快,平均效能好;

缺點:是要求待查表為有序表,且插入刪除困難。

因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。

2樓:匿名使用者

二分法查詢演算法又叫折半查詢。其思想是將已排好序的數列依次存入陣列,設查詢數值為x,用指標bot指向數列最左端位置(最小值),指標top指向數列最右端位置(最大值),取bot和top的中間值mid指向數列中間。

具體步驟解釋如下:當top>bot時,比較查詢x與a[mid],有3種可能。

若x = a[mid],則表示找到,退出比較查詢。

若x < a[mid],則選擇前半段繼續比較查詢,bot不變,top變成mid-1。

若x > a[mid],則選擇後半段繼續比較查詢,bot變成mid+1,top不變

結束過程有兩種:一種是找到了x = a[mid];另一種是沒找到,即top < bot。

二分查詢也稱折半查詢(binary search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。

3樓:清和神子

演算法思想:

折半查詢(binary search)的查詢過程是:先確定等查記錄所在範圍(區間),然後逐步縮小範圍直到找到或找不到該記錄為止。

步驟如下:

比較x和a的中間元素a[mid],

若x=a[mid],則x在l中的位置就是mid;

如果x如果x>a[mid],則x在a[mid]的後面。

無論在哪部分查詢x,其方法都和在a中查詢x一樣,只不過是查詢的規模縮小了。這就說明此問題滿足分治法的第二個和第三個適用條件。

二分查詢也稱折半查詢(binary search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。

首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

4樓:匿名使用者

#includeusing namespace std;#define n 10 int half(int s,int a,int b,int key) } int main()

答案補充

在對數列查詢之前,可能已經知道了數列的許多相關資訊。比如說,知道了有序數列的大體分佈等。如果知道了有序數列中每相鄰兩個元素之差的最大值的一個上界,這時可以在每次迴圈做折半之前先進行一次篩選工作,把儘可能多的不必要的元素過濾掉,這樣可以極大地提高查詢速度。

其最壞情況下查詢一個元素的最大比較次數將介於1和[ log2 n ] + 1 ( n為元素的個數)之間。另外,在實際的很多應用中可通過在建立有序數列的過程中同時得到m。比如說在建立陣列的過程中可根據插入新元素的情況不斷地更新m,從而在每次查詢的過程中極大地提高效率

5樓:這名字夠隨便

你對對半查詢理解錯了,你的min,max應該是下標而不是值

原理:類似於二分法解方程,二分查詢首先比對序列中間的數是否是要找的數,如果不是,由於是有序數列,則看其在左側區間還是右側區間,捨棄不在的那一半區間,然後在剩餘的區間重複剛才的辦法,直到找到該數,由於每次捨棄一半的資料量,所以查詢效率較高。

描述:設三個變數 left,right,middle分別為序列的兩側下標和中間下標,當判斷出不在左側區間,則 left=middle+1 ,從而利用右側一半構造出一個新區間,否則 right=middle-1,利用左邊一側構造新區間,然後重複剛才過程,如此下去,要麼找到資料,要麼left>right,此時也應該停止查詢,說明序列中沒有該數。

6樓:匿名使用者

折半查詢的基本思想是:對於有序表,查詢時先取表中間位置的記錄關鍵字和所給關鍵字進行比較,若相等,則查詢成功;如果給定值比該記錄關鍵字大,則在後半部分繼續進行折半查詢;否則在前半部分進行折半查詢,直到查詢範圍為空而查不到為止。

折半查詢的過程實際上死先確定待查詢元素所在的區域,然後逐步縮小區域,直到查詢成功或失敗為止。

演算法中需要用到三個變數,low表示區域下界,high表示上界,中間位置mid=(low+high)/2

演算法:#define maxlen n

......

......

int binsearch(datatype a,int k)

return -1; //查詢失敗,返回-1

}這只是演算法,運用要靠你自己!

c++折半查詢法

7樓:匿名使用者

首先,應當宣告兩個變數來記錄這般查詢空間的範圍,這裡我們定義begin和end;其次判斷語句if(x=a[i])中x=a[i]是賦值語句,"=="是判斷相等運算子,應該為if(x == a[i]);最後,主函式為int型,應最後返回0表示執行成功,即在程式結尾家return 0;

以下是我在你**基礎上略加修改,已通過執行併成功。

#include

int main()

else

if (x>a[i])

end = i - 1;

else

begin = i + 1;

}return 0;}

8樓:匿名使用者

你對對半查詢理解錯了,你的min,max應該是下標而不是值原理:類似於二分法解方程,二分查詢首先比對序列中間的數是否是要找的數,如果不是,由於是有序數列,則看其在左側區間還是右側區間,捨棄不在的那一半區間,然後在剩餘的區間重複剛才的辦法,直到找到該數,由於每次捨棄一半的資料量,所以查詢效率較高。

描述:設三個變數 left,right,middle分別為序列的兩側下標和中間下標,當判斷出不在左側區間,則 left=middle+1 ,從而利用右側一半構造出一個新區間,否則 right=middle-1,利用左邊一側構造新區間,然後重複剛才過程,如此下去,要麼找到資料,要麼left>right,此時也應該停止查詢,說明序列中沒有該數。

const int n=10;

int left,right,middle,x;

int a[n]=;

cout << "輸入個要查詢的數: ";

cin>>x;

for (left=0,right=n-1;left<=right;)

{middle=(left+right)/2;

if (x==a[middle])

break;

else if (x

9樓:風若遠去何人留

折半查詢法是演算法一種,可以被任何計算機語言使用。用c語言自然也可以實現。

1、定義:

在電腦科學中,折半搜尋(英語:half-interval search),也稱二分搜尋(英語:binary search)、對數搜尋(英語:

logarithmic search),是一種在有序陣列中查詢某一特定元素的搜尋演算法。

搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

2、查詢規則:

折半查詢法是效率較高的一種查詢方法。假設有已經按照從小到大的順序排列好的五個整數a0~a4,要查詢的數是x,其基本思想是: 設查詢資料的範圍下限為l=0,上限為h=4,求中點m=(l+h)/2,用x與中點元素am比較,若x等於am,即找到,停止查詢;否則,若x大於am,替換下限l=m+1,到下半段繼續查詢;若x小於am,換上限h=m-1,到上半段繼續查詢;如此重複前面的過程直到找到或者l>h為止。

如果l>h,說明沒有此數,列印找不到資訊,程式結束。

int bin_search(int a,int n,int key)

}return -1;//未找到,返回-1.}

10樓:億戀

第一個錯誤if語句巢狀不正確 如果a[i]<=b時函式直接運算x=x+1那條語句 應改為

if(a[i]==b)

else if(a[i]>b) m=i;

else n=i;不過這樣改了還不正確 那是因為for語句有問題 如果b=1 你的程式結果是木有 這顯然錯了 應改為標準答案那樣

11樓:水天之山

else只執行其下的一條語句,你程式中第一次就break跳出了,可定錯了。

改為:else

12樓:伊·梵

if (x=a[i]) /* 應該是x==a[i]吧 */用遞迴實現,程式會很好理解

int f(int a,int x, int start,int end)

修改如下:

#include

void main()

else if (x>a[i]) end = i-1;

else start=i+1; } }

13樓:

#include

#include

int cmp(const void * a,const void * b)

void main()

else if (x>a[i])

start = i+1;

else

end=i-1; } }

jit的基本思想 目標體系 基本手段

一 jit生產方式的基本思想是 只在需要的時候,按需要的量,生產所需的產品 也就是追求一種無庫存,或庫存達到最小的生產系統。jit的基本思想是生產的計劃和控制及庫存的管理。二 目標體系是廢品量最低 零廢品 jit要求消除各種引起不合理的原因,在加工過程中每一工序都要求達到最好水平。庫存量最低 零庫存...

尼采基本思想的解釋是什麼

尼采的思想反映了當時正在形成的壟斷資產階級的要求和願望。他譴責自由資回產階級,稱他們為 答因循守舊 苟且偷生的庸人,認為必須否定受理性主義 教以及人道主義的影響而日趨沒落的西方文明,提倡主觀戰鬥精神和對生活的肯定態度,強調進化即是權力意志實現其自身的過程,人生的目的就在於發揮權力,擴張自我。鼓吹超人...

向量控制的基本思想是什麼

在變頻器調速技術成熟之前,直流電動機的調速特性被公認為是最好的,如圖2 7 所示。究其原因,直流電動機優異的調速效能是具備瞭如下三個條件 1.磁極固定在定子機座上,在空間能產生一個穩定直流磁場。2.電樞繞組是固定在轉子鐵心槽裡,在空間能產生一個穩定的電樞磁勢,並且電樞磁勢總是能保持與磁場相垂直,產生...