الگوریتم جستجوی دودویی
الگوریتم جستجوی دودویی یا جستجوی دودویی خوارزمی، تکنیکی است برای یافتن یک مقدار عددی از میان مجموعه‌ای از اعداد مرتب. این متد محدودهٔ جستجو را در هر مرحله به نصف کاهش می‌دهد، بنابراین هدف مورد نظر یا به زودی پیدا می‌شود یا مشخص می‌شود که مقدار مورد جستجو در فهرست وجود ندارد.
جستجوی دودویی فقط در آرایه‌های مرتب استفاده می‌شود. در این روش عنصر مورد نظر با خانه وسط آرایه مقایسه می‌شود اگر با این خانه برابر بود جستجو تمام می‌شود اگر عنصر مورد جستجو از خانه وسط بزرگتر بود جستجو در بخش بالایی آرایه و در غیر این صورت جستجو در بخش پایینی آرایه انجام می‌شود (فرض کرده‌ایم آرایه به صورت صعودی مرتب شده‌است) این رویه تا یافتن عنصر مورد نظر یا بررسی کل خانه‌های آرایه ادامه می‌یابد.
جستجوی دودویی نمونه‌ای از الگوریتمهای تقسیم و غلبه می‌باشد.
پیدا کردن اندیس یک عنصر خاص در یک لیست مرتب شده مفید است زیرا با استفاده از اندیس داده شده می‌توان به سایر اطلاعات مربوطه دست یافت.
فرض کنید داده ساختاری شامل مجموعه‌ای از اطلاعات نام آدرس و شماره تلفن و غیره‌است و آرایه ای که نام‌ها را دربردارد از ۱ تا N شماره‌گذاری شده‌است، یک در خواست می‌تواند این باشد: شماره فردی به نام X چند است. برای پاسخ دادن به این سؤال آرایه مورد نظر باید جستجو شده و اندیس مربوط به نام داده شده در صورت وجود برگردانده شود، در این حالت شماره تلفن ذخیره شده در آرایه تلفن‌ها در این اندیس، همان شماره فرد X است و به همین ترتیب برای آدرس و غیره نیز می‌توان عمل کرد.
n تعداد گره‌ها در یک درخت دودویی کامل است و با استفاده از این فرمول می‌توان آن را یافت "formula_1" (در آن h عمق درخت است) N تعداد گره‌ها در یک درخت دودویی کامل است حداقل برابر "formula_2" و حداکثر برابر"formula_1" (h عمق درخت است) L تعدادی از گره‌های برگ در درخت دودویی کامل است و با استفاده از فرمول "formula_4" محاسبه می‌گردد.
N تعداد گره‌ها در یک درخت دودویی کامل نیز می‌تواند با استفاده فرمول "formula_5" محاسبه می‌شود. (L، تعدادی از گره‌های برگ در درخت است)
تعدادی از لینک‌های تهی (فرزندان غایب از گره‌ها) در یک درخت دودویی کامل از n گرهformula_6 تعداد "formula_7" از گره‌های داخلی در یک درخت دودویی کامل از n گره (گره‌های غیر برگ) formula_8. برای هر درخت غیر تهی با گره‌های برگ formula_9 و formula_10 گره‌ها از درجه 2 formula_11.
اثبات:
N = تعداد کل گره B = تعداد شاخه‌ها
این بازی‌های ساده با چیزی شبیه این شروع می‌شوند:" من عددی را بین ۴۰ و ۶۰ در نظر گرفته‌ام و تو آن را حدس می‌زنی و من با این پاسخ‌ها تو را راهنمایی می‌کنم: کمتر، بیشتر و بله!
فرض کنید تعداد اعداد ممکن برابر N است، بنابراین formula_12 سؤال لازم است تا عدد مورد نظر پیدا شود چون هر سؤال فضای جستجو را نصف می‌کند.
حتی اگر محدودهٔ اعداد مورد نظر نا محدود باشد (یعنی توسط N محدود نشده باشد) باز هم می‌توان با حداکثر formula_13 مرحله (که K عدد انتخاب شده‌است) عدد مورد نظر را یافت. بدین ترتیب که با شروع از یک و دو برابر کردن آن در هر مرحله ابتدا مرز بالایی را پیدا نموده و سپس عدد خواسته شده را پیدا می‌کنیم. به عنوان مثال اگر عدد انتخاب شده ۱۱ باشد ما می‌توانیم ترتیب پرسش‌های زیر را برای پیدا کردن عدد دنبال کنیم: ۱ ← ۲ ← ۴ ← ۸ ← ۱۶ ← ۱۲ ← ۱۰ ← ۱۱.
هم چنین می‌توان این تکنیک را گسترش داد تا شامل اعداد منفی نیز بشود، به عنوان مثال حدس‌های زیر دنبال می‌شوند تا عدد ۱۳- پیدا شود: ۰ ← ۱- ← ۲- ← ۴- ← ۸- ← ۱۶- ← ۱۲- ← ۱۴- ← ۱۳-.
انسان‌ها معمولاً ترکیبی از جستجوی دودویی و الگوریتم‌های جستجوی الحاقی را هنگام جستجوی دفترچه تلفن به کار می‌برند. بعد از حدس اولیه ما از این حقیقت استفاده می‌کنیم که ورودی‌ها مرتب اند و در نتیجه سریع تر به هدف می‌رسیم. مثلاً وقتی به دنبال «کریمی» می‌گردیم اگر «گنجی» و «قلی پور» پیدا شوند ما می‌توانیم به صفحه‌ای بین حدس‌های قبلی مراجعه کنیم و اگر مثلاً «کمالی» را نشان می‌داد می‌دانیم که صفحهٔ مورد نظر جایی بین «قلی پور» و «کمالی» خواهد بود.
برای این که وارد جزئیات تابع شویم باید قراردادهای رسمی تری را تعریف کنیم. ایده اولیه این است که داده ساختاری وجود دارد که به صورت آرایه A نمایش داده می‌شود، و المان‌های آن به صورت A(1), A(2),…,A توصیف می‌شوند و به هر ترتیبی قابل دستیابی‌اند.
داده ساختاری شامل دادهٔ دیگری به نام Key می‌شود، آرایه به گونه‌ای مرتب می‌شود که A(1).Key <= A(2).Key و ….
هدف این است که مقدار x داده شده و اندیس p پیدا شود به‌طوری‌که A(p).Key = x.
برای آغاز محدوده‌ای که باید جستجو شود کل داده‌هایی است که با متغیرهای L و R مشخص می‌شود و این مرزها در هر بار تکرار الگوریتم کاهش می‌یابند.
یکی از روش ها برای پیدا کردن عنصر مورد نظر x در یک آرایه بنام A روش تکرار است،که مراحل زیر را شامل می شود:
1.دو متغیر i و j به ترتیب مقادیر اولیه 0 و n-1 را می گیرند.(n طول آرایه مورد نظر است.)
2.تا زمانیکه formula_14 است مراحل زیر را اجرا می کنیم:
2.1.متغیر k مقدار formula_15 را که همان سقف formula_16 است را می گیرد.
2.2.اگر formula_17 باشد، j مقدار k-1 میگیرد.
2.3.اگر formula_18 باشد، i مقدار k را میگیرد.
3.حال formula_19 است،اگر formula_20بود، i را خروجی میدهیم در غیر این صورت خروجی نخواهیم داشت.
Niklaus Wirth الگوریتم تکرار را در پاسکال ارائه کرده‌است:
پیاده‌سازی متداول این تابع توسط الگوریتم بازگشتی زیر می‌باشد:
پیاده‌سازی متداول این تابع توسط الگوریتم بازگشتی در سی شارپ به صورت زیر می‌باشد:
برای یافتن عنصر سمت چپ عنصر مورد نظرمان یعنی T در آرایه A به ترتیب زیر عمل میکنیم:
1.به ترتیب به L و R مقادیر اولیه 0 و n را می دهیم.
2.تازمانیکه Lجزء صحیح formula_22 می باشد.
2.2.اگر formula_23 باشد،L مقدار m-1 را میگیرد.
2.3.اگر formula_24 باشد،R مقدار m را میگیرد.
3.مقدار L خروجی داده می شود.
شبه کد زیر این مراحل را نشان می دهد:  binary_search_leftmost(A, n, T):برای یافتن عنصر سمت چپ عنصر مورد نظرمان یعنی T در آرایه A به ترتیب زیر عمل میکنیم:
1.به ترتیب به L و R مقادیر اولیه 0 و n را می دهیم.
2.تازمانیکه Lجزء صحیح formula_22 می باشد.
2.2.اگر formula_27 باشد،R مقدار m را میگیرد.
2.3.اگر formula_28 باشد،L مقدار m+1 را میگیرد.
3.مقدار R-1 خروجی داده می شود.
شبه کد زیر این مراحل را نشان می دهد:  binary_search_rightmost(A, n, T):