1909 - 改写二分搜索算法

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置 i 和大于x的最小元素位置 j。当搜索元素在数组中时,i 和 j 相同,均为x在数组中的位置。

题目输入

输入的第一行为搜索元素x,第二行为数据元素个数n,第三行为数组各元素。

题目输出

输出x是否搜索到,如果搜索到返回1,同时输出元素的位置,否则,返回0,输出第i个元素和第j个元素及位置。

输入/输出样例

输入格式

4
5
1 3 5 6 8

输出格式

0
1
2

C语言解答

/*设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,
返回小于x的最大元素的位置 i 和大于x的最小元素位置 j。当搜索元素在数组中时,i 和 j 相同,
均为x在数组中的位置。*/
#include<stdio.h>
int main()
{
	void BFind(int *,int ,int,int);
	int x,n,i;
	scanf("%d%d",&x,&n);
	int t[n];
	for(i=0;i<n;i++)
        scanf("%d",&t[i]);
	BFind(t,0,n,x);
	return 0;
}
void BFind(int *t,int m,int n,int x)
{
	while(m<n)
	{
		if(x>t[(m+n)/2])
			m=(m+n)/2+1;
        if(x<t[(m+n)/2])
            n=(m+n)/2-1;
        if(x==t[(m+n)/2])
            {
                printf("1\n%d\n",(m+n)/2);
                return ;
            }
	}
	printf("0\n%d\n%d\n",m,m+1);
	return ;
}

C++解答

#include<iostream>
using namespace std;
int B(int a[],int x,int n,int &i,int &j)
	{    
		int left=0;
	    int right=n-1;
		while(left<=right)
		{
			int middle=(left+right)/2;
				if(x==a[middle])
					return middle;
				if(x>a[middle])
				left=middle+1;
				else
				right=middle-1;
	
		}
		i=right;
		j=left;
		return -2;
	}
int main()
	{
	
        int x,n;
		int i=0;
		int j=0;
		cin>>x>>n;
		int a[1000];
		for(i=0;i<n;i++)
		cin>>a[i];
		int C=B(a,x,n,i,j);
	if(C>=0)
		cout<<1<<"\n"<<C<<endl;
	else
		cout<<0<<"\n"<<i<<"\n"<<j<<"\n";
}

Java解答



import java.util.Scanner;

public class Main
{
    /**
     * 
     * BinarySearch Demo
     * 
     * @param sortedArray
     * @param targetElement
     *            -the element you what to find
     * 
     * @return the position of the finded value in array
     * 
     */
    public static int BinarySearchDemo(int[] sortedArray, int targetElement)
    {
        int left = 0;
        int right = sortedArray.length - 1;
        int middle = 0;
        while (left <= right)
        {
            middle = (left + right) / 2;

            if (targetElement == sortedArray[middle])
            {
                // System.out.println("the position of  target is " + middle);
                System.out.println(1);
                System.out.println(middle);
                 return middle;
               
            }
            else if (targetElement > sortedArray[middle])
            {
              
                left = middle + 1;
            }
            else
            {
               
                right = middle - 1;
            }

        }

        if (middle - 1 < 0)
        {
            // System.out.println("the target element is not in the array ,the position of  smallest element which bigger than target is: "
            // + (middle));
            System.out.println(0);
            System.out.println(middle);
        }
        else if (middle + 1 == sortedArray.length)
        {
            // System.out.println("the target element is not in the array ,the position of  biggist element which smaller than target is: "
            // + (middle));
            System.out.println(0);
            System.out.println(middle);
        }

        else
        {
            if (sortedArray[middle] < targetElement)
            {
                System.out.println(0);
               // System.out.println("right " + (middle + 1));
                System.out.println(middle);
                System.out.println(middle + 1);
              //  System.out.println("left " + (middle));
               
            }
            if (sortedArray[middle] > targetElement)
            {
              //  System.out.println("right " + (middle));
                System.out.println("right " + (middle-1));
                System.out.println("right " + (middle));
              //  System.out.println("left " + (middle - 1));
            }
        }
        //-1 for find nothing
        return  - 1;       

    }

    public static void main(String[] args)
    {
        Scanner scanner=new Scanner(System.in);
       int target= scanner.nextInt();
       int number=scanner.nextInt();
       
        
        int[] testArray = new int[number] ;
        for(int i=0;i<number;i++)
        {
            testArray[i]=scanner.nextInt();
        }
        BinarySearchDemo(testArray, target);        
    }

}