ループが回転ソートされた配列でバイナリ検索検索の配列を命じました


バイナリサーチは整然とした、順次記憶構造のためのスキルを習得する必要があります。

1、の数を見つけるためにそれを使用することができます

2、一定の範囲を見つけるために使用することができます。このような「二分法は、範囲を検索範囲に注文したアレイの数を検索」など。

3、次の2つの注文の配列の中央値を見つけるためにそれを使用することができます。

図4は、この記事で、新しいスキルのバイナリサーチ加えて、あなたはループ秩序配列に番号をルックアップするためにそれを使用することができます。

2分後、中間インデックスが決定半ばであり、私はキー半ばのどちら側に伝えることができ、その後、その辺を見つけるために、キーを見つけます。

ループ配列を命じました。

手段配列にいくつかの距離の後に円形の左/右の規則正しい配列こと。例えば、[1,2,3,4,5]右回転3は、[4,5,1,2,3]となります。配列の特長は、転換点が含まれているということです。サブアレイの左右に旋回点は順序付けされ、全体的なアレイの右側サブアレイは、左側の子よりも大きいです。

方法を探します:

ターニングポイントは、直接配置を考えてはいけません。

ちょうどライン上の中間点における転換点のどちら側を知っておく必要があります。ターニングポイントのない側が単調に増加しなければならないので、まだ私が半ばにおけるキーのどちら側の決定を支援することができます。

左と右の添字、添字半ばを決定しました。

A [左] <= A [中間]場合は、A [中間]は、中間の全体の左半分は、厳密に増加しており、したがって、私は左半分のキーか否かを決定することができた意味することを必ずしも左から左側に旋回点ではありません年。

A [左]> A [中期]場合、Aは、[中期]中旬から左側のターニングポイントで少しは、右の全体の右半分が厳密に増加しているので、私はキーが右半分にあったかどうかを判断することができたことを意味します。

(配列内の重複する要素が含まれていない)を実装。


クラス解決{
パブリック:
 
int型の検索(INT A []、INT nは、INTターゲット)
{
    IF(N <= 0)
        リターン-1。
    INTが左= 0、右= N-1;
    一方(左<=右)
    {
        int型のミッド=左+((左右)/ 2)。
        IF(A [中間] ==ターゲット)
            戻りミッド。
 
        IF(A [左] <= A [中間])//转折点在右半边
        {
            IF(A [左] <=ターゲット&&ターゲット<A [中間])
                右=ミッド- 1。
            他に
                左=ミッド+ 1;
        }
        他//转折点在左半边
        {
            IF(A [中間] <ターゲット&&ターゲット<= A [右])
                左=ミッド+ 1;
            他に
                右=中旬- 1。
        }
    }
    リターン-1。
}
 
}。


上記の方法は、要素の繰り返し配列が存在する場合を考慮していません。

2つ(配列の要素の可能な複製)を実装。


クラス解決{
    パブリック:
        ブール検索(INT A []、INT nは、INT対象){
            戻りbisearch(A、0、N-1、ターゲット)
        }
 
        BOOL bisearch(INT A []、intは左、右のint、int型のターゲット)
        {
            IF(左>右)
                リターン偽。
            int型ミッド=左+(右-左)/ 2;
            (ターゲット== A [中期])場合は
                trueを返します。
            // A [左]、A [中間]、A [右]
            // 1 3 5
            (A [中間]> A [左] && A [中間] <A [右])//普通二分なら
            {
                IF(ターゲット<A [中間])
                    戻りbisearch(A、左、中1、ターゲット)
                他の
                    リターンbisearch(A、ミッド+ 1、右、ターゲット)。
            }
            // 5 1 3
            そうであれば(A [中間] <A [左] && A [中間] <A [右])//转折在左侧
            {
                IF(ターゲット> A [中間] &&ターゲット<= A [右])
                    戻りbisearch(A、中間+ 1、右、ターゲット)
                他の
                    リターンbisearch(A、左、中1、ターゲット)。
            }
            // 3 5 1
            他IF(A [中間]> A [左] && A [中間]> A [右])//转折在右侧
            {
                IF(目標<A [中間] &&ターゲット> = A [左])
                    戻りbisearch(A、左、中1、
                他
                    戻りbisearch(A、+ MID 1、右、ターゲット。);
            }
            // 3. 3. 3
            この場合であると他//方法は、左、右の判断に等しい
            {
                、、、。1-MID戻りbisearch(A左ターゲット)|| bisearch(A、+ MID 1、右、ターゲット);
            }
 
        }
 
 
}。

 

公開された17元の記事 ウォンの賞賛2 ビュー50000 +

おすすめ

転載: blog.csdn.net/u011250186/article/details/103865170