分治法:二分检索算法

原创 2007年09月19日 13:27:00

  已知一个按非降次序排列的一的元素表a1,a2,a3....,an,要求判定给定元素在元素表中是否出现,如出现找出给定元素的位置,这个问题就可以用到 分治法中的二分检索法来做

算法:

procedure BINSRCH(A,n,x,j) 
//一个非降序排列的元素数组A(1:n),n>=1,判断x是否出现。若出现,置j,使得x=A(j),若不出现,j=0//
integer low,high,mid,j,n;
low
<-- 1;high<-- n
while low<=high do
    mid
<--|_(low+high)/2_|
 
case
       :x
<A(mid):high<--mid-1
       :x
>A(mid):low<--mid+1
       :
else:j<--mid;return
 endcase
j
<--0
end BINSRCH 

时间复杂度

                           成功的检索                                                                            不成功的检索

       最好:o(1) 平均:o(logn) 最坏o(logn)                                                 最好平均最坏:o(logn)      

实现例子(C#) BINSRCH.cs

using System;
using System.Text;

namespace cn.blogs
{
    
/// <summary>
    
/// 用分治法进行二分检索
    
/// 任意给定10个整数,选取一检索元,分成功和不成功两种情况进行二分检索
    
/// </summary>
    public class BINSRCH
    {
        
static void Main()
        {
            
int[] a=new int[]{10,20,30,40,50,60,70,80,90,100};
            
int x = 0;
            
try
            {
                Console.WriteLine(
"请填入你要查找的一个数字");
                x 
= int.Parse(Console.ReadLine());
            }
            
catch
            {
                Console.WriteLine(
"请填数字");
            }
            
if (bin(a, 10, x) == -1)
            {
                Console.WriteLine(
"没有找到你要的数字");
            }
            
else
            {
                Console.WriteLine(
"用二分检索查找出位置为" + (bin(a, 10, x) + 1));
                Console.WriteLine(
"用递归二分算法查找出位置为" + (binD(a, 10, x, 09+ 1));
                Console.WriteLine(
"用三分检索查找出位置为" + (triplesrch(a, 10, x) + 1));
                Console.WriteLine(
"用递归三分检索查找出位置为" + (triplesrchD(a, 10, x, 09+ 1));
            }
        }
        
private static int bin(int[] A,int n,int x)
        {
//二分检索算法
            int low,high,mid;
            low
=0;
            high
=n-1;
            
while(low<=high)
            {
                mid
=(low+high)/2;
                
if(x<A[mid])
                {
                    high
=mid-1;
                }
                
else if(x>A[mid])
                {
                    low
=mid+1;
                }
                
else
                {
                    
return mid;
                }
            }
            
return -1;
        }


        
private static int binD(int[] A, int n, int x,int low,int high)
        {
//递归二分检索算法
            int mid;
            
while (low <= high)
            {
                mid 
= (low + high) / 2;
                
if (x < A[mid])
                {
                    high 
= mid - 1;
                    
return (binD(A, n, x, low, high));
                }
                
else if (x > A[mid])
                {
                    low 
= mid + 1;
                    
return (binD(A, n, x, low, high));
                }
                
else
                {
                    
return mid;
                }
            }
            
return -1;
        }

        
private static int triplesrch(int[] A, int n, int x)
        {
//三分检索算法
            int low, high, mid1,mid2;
            low 
= 0;
            high 
= n - 1;

            
while (low <= high)
            {
                mid1 
= low + (high - low) / 3;
                mid2 
= low + 2 * (high - low) / 3;
                
if (x < A[mid1])
                {
                    high 
= mid1 - 1;
                }
                
else if (x > A[mid2])
                {
                    low 
= mid2 + 1;
                }
                
else if (x > A[mid1] && x < A[mid2])
                {
                    low 
= mid1 + 1;
                    high 
= mid2 - 1;
                }
                
else if (x == A[mid1])
                {
                    
return mid1;
                }
                
else if (x == A[mid2])
                {
                    
return mid2;
                }
            }
            
return -1;
        }


        
private static int triplesrchD(int[] A, int n, int x, int low, int high)
        {
//递归三分检索算法
            int mid1, mid2;
            
while (low <= high)
            {
                mid1 
= low + (high - low) / 3;
                mid2 
= low + 2 * (high - low) / 3;
                
if (x < A[mid1])
                {
                    high 
= mid1 - 1;
                    
return triplesrchD(A, n, x, low, high);
                }
                
else if (x > A[mid2])
                {
                    low 
= mid2 + 1;
                    
return triplesrchD(A, n, x, low, high);
                }
                
else if (x > A[mid1] && x < A[mid2])
                {
                    low 
= mid1 + 1;
                    high 
= mid2 - 1;
                    
return triplesrchD(A, n, x, low, high);
                }
                
else if (x == A[mid1])
                {
                    
return mid1;
                }
                
else if (x == A[mid2])
                {
                    
return mid2;
                }
            }
            
return -1;
        }

    }
}

 

 

二分检索(分治法)

  • 2015年11月17日 14:42
  • 1005B
  • 下载

三分检索----分治法实现

  • 2010年12月22日 09:19
  • 907B
  • 下载

005-二分搜索-分治法-《算法设计技巧与分析》M.H.A学习笔记

二分搜索又称折半查找,用于在排序好的序列表中进行搜索,搜索效率高,可在最坏的情况下用O(log n)完成搜索任务。...

分治法的算法

  • 2015年04月14日 13:01
  • 3KB
  • 下载

算法设计与分析之分治法

  • 2015年06月18日 20:57
  • 55KB
  • 下载

算法05:二分搜索算法——分治法Part1

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。...

分治法快速排序算法QuickSort C++

  • 2013年11月04日 14:23
  • 12KB
  • 下载

分治法快速排序算法QuickSort

  • 2013年11月04日 14:28
  • 11KB
  • 下载

c++实现分治法最近点对算法

最近点对的算法是分治法的典型代表,所求的是平面上一堆点,求所有点对的距离的最小值,如果用暴力方法,其复杂度高达O(n*n)显然,效果太差,分治法的思想是将平面上的点分成左右两半,分别求左右两半的最小距...

算法分析之分治法

  • 2014年07月08日 19:05
  • 102KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分治法:二分检索算法
举报原因:
原因补充:

(最多只允许输入30个字)