算法_分治算法

14天阅读挑战赛

分治算法

    • 分治算法是什么?
    • 分治算法的要素
    • 二分法搜索
        • 问题:
      • 问题分析:
    • 代码实现

分治算法是什么?

  • 如同在古代,将帅管理军队的时候,或是,近日内的公司管理制度等
    • 在以上等情况下,都有一个共同的特点 —— >(上级管理下级,并非上级管理所有人)
    • 这与分治算法很相同。
  • 分治算法的本质
    • 将一个大规模的问题化解为若干规模较小的子问题,分而治之。

分治算法的要素

  • 什么的问题才能使用分治算法呢?
    • 原问题可分解为若干规模较小的相同子问题。
    • 子问题相互独立。
    • 子问题的解可以合并为原文的解。

二分法搜索

问题:
有一个有序的数组,a[n] , 在数组中查照元素 x , 如何尽可能高效的查出元素x呢?

问题分析:

如果是n个数,最坏的打算的是,一个一个的进行查照,查照n次。
其实不然,我们还有一种思路:
	数组是有序的 , 所以我们可以 截取a[n] 中间的元素与x相比。
		如果大于:则在数组a[n]的后半部分查找。
		如果小于:则在数组a[n]的前半部分查找。

代码实现

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int x;				//要查询的元素
	
	int low,high;		//查找数组的两个范围 
	 
	int size = 0;		//数组的大小 
	cout<<"输入数组大小"<<endl; 
	cin>>size;
		
	int a[size];		//要被查询的数组a
	 
	for(int i = 0;i<size;i++)				//给数组a赋值 
	{ 
		cout<<"输入第"<<i<<"个元素"<<endl; 
		cin>>a[i]; 
	} 
	
	cout<<"输入要查询的元素"<<endl<<"x = ";
	cin>>x;
	
	//对数组进行排序(默认升序)
	sort(a,a+size);
	
	cout<<"排序后的数组:"<<endl; 
	for(int i =0;i<size;i++)
		cout<<i<<":"<<a[i]<<endl;
		
	cout<<endl<<endl; 
	
	
	//查找:
	low = 0; 		//查询范围的上界.数组的第一个元素 
	high = size-1;	//查询范围的下界,数组的最后一个元素 
	
	int index = -1;	//元素x所在的索引 
	
	while(low <= high)
	{
		int middle = (low+high)/2;	//找出中间元素
		if(x == a[middle])
		{	
			index = middle;		//只有找了才进行赋值 
			break;	
		} 
		else if(x < a[middle])	//如果x小于中间元素 , 则下界范围缩小 
			high = middle-1;
		else 
			low = middle +1;	//如果x大于中间元素,则上页范围缩小. 
	}
	
	if(index == -1)
		cout<<"未找到x"<<endl;
	else
		cout<<"x所在位置:"<<index<<endl; 
	
	return 0;
}

在这里插入图片描述

如果元素不存在呢?
在这里插入图片描述


下期见咯

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值