zoukankan      html  css  js  c++  java
  • 【设计和算法分析】3、二进制搜索

    /**
    * 书:《设计和算法分析》
    * 特征:二进制搜索
    *		1、建立a[0:n-1]是一排的阵列已经好序。请重写二进制搜索算法,因此,搜索元素时x不用时,该阵列。返回小于x最大的元素
    *		S档I而超过x最小的元素位置j。在数组中的时候。I和j同样,均为x在数组中的位置
    * 文件:lesson3.cpp
    * 时间:2014年11月4日19:50:20
    * 作者:cutter_point
    */
    
    #include <iostream>
    
    using namespace std;
    
    //这里a是用来搜索的序列,n是序列里面数据的个数,x是要找的数,i和j是用来找位置的
    bool erFen(int *a, int n, int x, int& i, int& j)	//i和j是两个引用
    {
    	int left = 0;	//查找的起始点
    	int right = n - 1;	//查找的终点
    	while (left < right)	//仅仅要还有数据没有被遍历,那就一直循环一直到找到,或者没有
    	{
    		int mid = (left + right) / 2;	//二分法的精髓,一分为二
    		if (x == a[mid])	//从中间開始比較
    		{
    			i = j = mid;	//假设正好是中间的那个数的话,把位置赋值给i,j
    			cout << "位置是:" << mid+1<<endl;
    			return true;
    		}
    		//假设不是中间那个地方的话
    		if (x > a[mid])	//因为是已经排好序了
    		{
    			//得到当前小于x的元素的位置
    			j = mid;
    			left = mid + 1;	//把后半部分作为新的起点
    		}
    		else
    		{
    			//得到当前大于x的元素位置
    			i = mid;
    			right = mid - 1;	//把前半部分作为新的数列
    		}
    	}
    
    	//假设没有找到
    	//i = right;
    	//j = left;
    	cout << "位置是:" << j+1 << " 和 " << i+1 << "之间" << endl;
    	return false;
    }
    
    int main()
    {
    	int n, x, i=0, j=0;
    	n = 0;
    	cout << "依次输入数列的长度n,要找的整数x(中间用空格隔开)" << endl;
    	cin >> n >> x;
    	int *a;
    	a = new int[n];
    	cout << "输入数组数据:" << endl;
    	for (int i = 0; i < n; ++i)
    	{
    		cin >> a[i];
    	}
    
    	erFen(a, n, x, i, j);	//i和j有两个引用
    
    	getchar();
    	return 0;
    }
    

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    纠结
    oracle大批量数据更新
    SQL Server 2008 “因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法
    面试总结
    Oracle 存储过程发送邮件
    ASP.NET页面之间传递值的几种方法<转>
    模式窗口里面,服务器控件添加确认操作时,又弹出新窗口
    深入研究Asp.net页面的生命周期<转>
    asp.net用jquery为服务器控件添加javascript处理
    sqlserver 把对象发布成webservice遇到的问题
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4752991.html
Copyright © 2011-2022 走看看