91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有關二分查找的邊界思考

發布時間:2020-06-11 22:18:24 來源:網絡 閱讀:648 作者:momo462 欄目:編程語言

1、二分查找概念

二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經常變動而查找頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。


2、二分查找簡單實現

(1)左開右閉 【 )

//非遞歸版本
int* BinarySearch(int *a,int n,int key)
{
	if (a==NULL||n==0)
	{
		return NULL;
	}
	//[)
	int left=0;
	int right=n;
	while(left<right) //如果寫成left<=right 有可能越界
	{
		int mid=left+(right-left)/2;
		if (a[mid]>key)
		{
			right=mid;     
			//如果寫成right=mid+1 元素如果是a[0]=0,a[1]=1,要找1
			//left=0,right=1,mid=0
			//然后a[mid]<1,right=mid;此時找不到1,因為left<right
			//所以當為【)不要把未判斷元素直接做right的下標
		}
		else if(a[mid]<key)
		{
			left=mid+1;
		}
		else
		{
			return a+mid;
		}
	}
	return NULL;
}
void testBinary()
{
	int a[10]={0,1,3,5,45,78,98,111,121,454};
	for (int i=9;i>=0;i--)
	{
		int *temp=BinarySearch(a,10,i);
		if(temp==NULL)
		{
			cout<<"NULL"<<endl;
		}
		else
			cout<<*temp<<endl;
	}
}
//遞歸版本
int * BinarySearch_R(int *a,int n,int key,int left,int right)
{
    if(a==NULL||n==0)
    {
        return NULL;
    }
    if(left<right)
    {
        int mid=left+(right-left)/2;
        if(a[mid]>key)
        {
            return BinarySearch_R(a,n,key,left,mid);
        }
        else if(a[mid]<key)
        {
            return BinarySearch_R(a,n,key,mid+1,right);
        }
        else
        {
            return a+mid;
        }
    }
    else
    {
        return NULL;
    }
}

void testBinary_R()
{
	int a[10]={0,1,3,5,45,78,98,111,121,454};
	for (int i=9;i>=0;i--)
	{
		int *temp=BinarySearch_R(a,10,i,0,10);
		if(temp==NULL)
		{
			cout<<"NULL"<<endl;
		}
		else
			cout<<*temp<<endl;
	}
}

(2)左閉右閉 【】

int* BinarySearch_C(int *a,int n,int key)
{
    if(a==NULL||n==0)
    {
        return NULL;
    }
    //[]
    int left=0;
    int right=n-1;
    while(left<=right)
    {
        int mid=left+(right-left)/2;
        if(a[mid]>key)
        {
            right=mid-1; //a[mid]的值已經判斷過了
        }
        else if(a[mid]<key)
        {
            left=mid+1; //a[mid]已經判斷過了
        }
        else
            return a+mid;
    }
    return NULL;
}

void testBinary()
{
	int a[10]={0,1,3,5,45,78,98,111,121,454};
	for (int i=9;i>=0;i--)
	{
		int *temp=BinarySearch_C(a,10,i);
		if(temp==NULL)
		{
			cout<<"NULL"<<endl;
		}
		else
			cout<<*temp<<endl;
	}
}

//遞歸版本
int * BinarySearch_CR(int *a,int n,int key,int left,int right)
{
    if(a==NULL||n==0)
    {
        return NULL;
    }
    if(left<=right)
    {
        int mid=left+(right-left)/2;
        if(a[mid]>key)
        {
            return BinarySearch_R(a,n,key,left,mid-1);
        }
        else if(a[mid]<key)
        {
            return BinarySearch_R(a,n,key,mid+1,right);
        }
        else
        {
            return a+mid;
        }
    }
    else
    {
        return NULL;
    }
}

void testBinary_R()
{
	int a[10]={0,1,3,5,45,78,98,111,121,454};
	for (int i=9;i>=0;i--)
	{
		int *temp=BinarySearch_CR(a,10,i,0,9);
		if(temp==NULL)
		{
			cout<<"NULL"<<endl;
		}
		else
			cout<<*temp<<endl;
	}
}

題目:

正整數數組a[0], a[1], a[2], ···, a[n-1],n可以很大,大到1000000000以上但是數組中每個數都不超過100。現在要你求所有數的和。假設這些數已經全部讀入內存,因而不用考慮讀取的時間。希望你用最快的方法得到答案。

提示:二分。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北宁市| 乐东| 奉贤区| 开封县| 桐乡市| 竹北市| 宽甸| 依兰县| 苍山县| 云和县| 始兴县| 沈丘县| 永济市| 清丰县| 景德镇市| 揭西县| 绍兴县| 六安市| 兴隆县| 桑植县| 清水河县| 米易县| 谷城县| 米脂县| 和田县| 长顺县| 昌邑市| 邻水| 万安县| 巴青县| 金溪县| 玉林市| 大埔区| 庄浪县| 东乡族自治县| 东宁县| 华池县| 仲巴县| 亳州市| 达州市| 金坛市|