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;
    }
    

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

  • 相关阅读:
    Exadata存储节点的CPU限制成功了没?
    如何减少Exadata计算节点CPU的Core数量
    如何选择适合你的HTAP数据库?
    小知识:Oracle中的层次查询
    小知识:使用MOS下载Oracle介质快速参考
    小知识:Flex ASM特性对集群资源显示的影响
    javaWeb request请求乱码、response响应中文乱码一站式解决方案
    java 文件File与byte[]数组相互转换的两种方式
    pr 如何调高导出视频的清晰度?
    pr 剪辑视频之剃刀用法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4752991.html
Copyright © 2011-2022 走看看