二分法
- binarySearchが配列中に存在を探し、インデックス値が数NUMに等しいです。(ときにランダム出力A複数の)
- 取得下界最初の配列に生じている、NUM値より大きい又はインデックス番号に等しいです
- UpperBound配列中に存在を見つけることが最初に、指標値は、番号numよりも大きいです
半ば裁判官を使用して、特定の番号を取得し、他の2つは、左右近づい使用されています。
定義によればbinarySearchにおいて、決定することができる理由は、プロセスは、転写ベルトの中間を必要としないので、それは、代わりに、正しい答えを含んではならない、対応する戻り値A [中間]でもあります
[中期]の変更で、binarySearchシーケンスをインクリメント:
- [中期] == NUM ---->リターン中旬
- [中期]> NUM ---->右=半ば1
- [中間] 1 <NUM ---->左=ミッド+
- 決意の条件は:左<=右、(限り、左ミドル、として、右可能正当なもの、等号を持参する必要があります)
下界では、最終的な位置は右、その配列は、現在の場所は本当に最初のものであるかを知らない前に完了し、インデックスのリターンを残し==残されています。
- 一部では、[中期]> = NUM ---->の結果、右=半ば、で[半ば、左]
- [中間] <NUM ---->中間に決定されてもよい左=ミッド+ 1に、不可能です
- これは、左のうち最後の時間であるため、左<右=右:条件をサイクリング
UpperBoundで、最終的にも左==右
- 一部では、[中期]> NUM ---->の結果、右=半ば、で[半ば、左]
- [中間] <= NUM ---->ミッド1 =ミッド+左、範囲内にありません
- ループ決意:左<=右、最終的にはループを終了し、右=左
下界とは、UpperBoundを参照することができる:最初の順序付けられたシーケンスを満たす長い境界決意の対応するセットを完成させることができるように変換などの条件要素の位置を見つけます。
binarySearch対応判定は:順序付けられたシーケンス内の要素は、見つけるために、現在位置として、存在するかどうかを決定します
書式#include <stdio.hに> する#include <iostreamの> の#include < 文字列の.h> 使用して 名前空間はstdを、 INT binarySearch(INT A []、intは左、INT右、INT NUM)// 找出NUM在A数组的位置 { int型ミッド=(左+右)/ 2 。 一方(左<= 右) { 半ば =(左+右)/ 2 。 もし([中期] == 数値) リターン・ミッド; もし([中期]> NUM) 右 =半ば。1 ; そうでなければ 、左 = MID + 1 ; } リターン - 1 ; } int型下界(INT A []、intは左、INT右、INT NUM)// 検索NUMが大きいか、またはよりは、アレイ内の最初の数に等しいです位置は { int型 MID =(左+右)/ 2 ; 一方(左< 右) { MIDは =(左+右)/ 2 ; IF([MID]> = NUM) { 右 = MID; } そう 左 = MID + 1 ; } リターン左; } int型のためには、UpperBound(int型 ] [、INTは、左INT右、INT numは)// 最初の数字の位置がNUMアレイよりも大きい見つけます { INT MID =(右+左)/ 2 ; 一方(左< 右) { MID =(右+左)/ 2 ; IF(A [MID]> NUM) 右 =ミッド; 他に 左 =ミッド+ 1 ; } 戻り左; } int型のmain() { int型はn = 5 。 INT [ 15 ] = { 1、3、3、3、6 }。 / * のための(INT I = 0、I <N; I ++) のscanf( "%dの"、および[I])を、* / のprintf(" %dの\ n "、binarySearch(0、N- 1、3 ))。 printf("、下界(、%D \ n " 0、N- 1、3 )); のprintf(" %dの\ n "、は、UpperBound(0、N- 1、3 )); 戻り 0 ; }