C++学习之二分查找

//radn.cc -->生成随机数
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#define ERR_EXIT(m)     do {         perror(m);        exit(EXIT_FAILURE);    }while(0)
using namespace std;
//写入文件
void writeIntegerToFile(int fd, int value)
{
    char text[100] = {0};

    snprintf(text, sizeof text, "%d\n", value);

    if(write(fd, text, strlen(text)) == -1)
        ERR_EXIT("write");
}

//返回time
double get_time()  // 对运行时间进行封装
{
    struct timeval tm;
    memset(&tm, 0, sizeof tm);
    if(gettimeofday(&tm, NULL) == -1)
        ERR_EXIT("gettimeofday");

    double res = 0.0;
    res += tm.tv_sec;
    res += tm.tv_usec / (double)1000000;
    return res;
}

int main(int argc, const char *argv[])
{
    double startTime = get_time();

    const int kSize = 1000000;
    srand(kSize);

    int fd = open("largeT.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
    if(fd == -1)
        ERR_EXIT("open");

    for(int i = 0; i != kSize; ++i)
    {
        writeIntegerToFile(fd, rand() % kSize);
    }

    close(fd);

    double endTime = get_time();
    double cost = endTime - startTime;
    cout << "花费时间 " << cost << " s" << endl;
    return 0;
}

2、二分查找算法:

注意:二分查找通常用在已经有序的数组中。

解法:

1):通过下标操作, 我们把要查找的元素值记为 val ,首元素的下标记为 low, 末尾元素的下标记为high; mid 为low 和 high 的中间值 ,即 mid = (high+low)/2 ;

2): 比较 val 与mid 所对应的元素值

3):如果 val 等于 当前的 mid 所对应的元素值 ,则查找成功 ;

4): 如果 val 大于 当前的mid 所对应的元素值, 则说明 我们要查找的元素 (可能)位于后半段 ;我们将当前的mid值 赋值给 low ,再将mid 的下标置为(low +high);执行 步骤 2)。

5): 如果 val小于 当前的mid 所对应的元素值, 则说明 我们要查找的元素 (可能)位于前半段 ;我们将当前的mid值 赋值给 high ,再将mid 的下标置为(low +high);执行 步骤 2)。

6):若当 low 的值 大于high 的值时 ,仍未找到该val ,则说明查找失败 。

代码如下:

//BinarySearch.cc
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#include <algorithm>
using namespace std ;

bool BinarySearch(const vector<int> vec , int val, int min, int  max)
{
    int mid = (min + max )/2  ;
    while( min <= max )
    {
        if(vec[mid] == val )
        {
            return true ;
        }else if( vec[mid] > val )
        {
            max = mid - 1 ;
            mid = (min + max) / 2 ;
        }else
        {
            min = mid + 1 ;
            mid = (min + max ) / 2 ;
        }
    }
    cout << "The val of the num is :" << val << " " << endl ;
    return false ;
}

int main(int argc, const char *argv[])
{
    FILE* fpLarge = fopen("largeT.txt" , "rb") ;
    FILE* fpSmall = fopen("smallT.txt" , "rb") ;
    if(NULL ==fpLarge  || NULL == fpSmall)
    {
        perror("open");
        exit(1);
    }
    vector<int> Larvec ;
    vector<int> Smlvec ;
   // int Ssize = 10000 ;
    int Lsize = 1000000 ;

    char buf[128] ;

    while(memset(buf , 0, sizeof(buf)) ,fgets(buf ,sizeof(buf) ,fpLarge)!= NULL)
    {
        int tmp = atoi(buf);
        Larvec.push_back(tmp);
    }
    sort( Larvec.begin() , Larvec.end());

    int val ;
    while(memset(buf , 0, sizeof(buf)) ,fgets(buf ,sizeof(buf) ,fpSmall)!= NULL)
    {
        val = atoi(buf);
        Smlvec.push_back(val);
    }
    int cnt = 0  ;//标记未查找成功的个数
    for(vector<int>::size_type ix = 0 ; ix != Smlvec.size() ; ++ix)
    {
        bool rec ;
        rec = BinarySearch(Larvec , Smlvec[ix], 0 , Lsize );
        if(!rec)
            cnt ++ ;
    }
    cout << "The cnt of Searching false is :  " << cnt << endl ;//输出查找失败总数
    cout << "Time used =  "  << (double)clock()/CLOCKS_PER_SEC << endl ;//输出程序运行时间
    fclose(fpLarge);
    fclose(fpSmall);
    return 0;
}
时间: 2024-10-18 23:42:40

C++学习之二分查找的相关文章

Java学习之二分查找算法

好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己写的代码: 1 package com.gh; 2 3 import java.util.Arrays; 4 /** 5 * 二分查找算法实现 6 * @author ganhang 7 * 8 */ 9 public class Search { 10 public static void mai

#STL函数学习:二分查找函数/去重函数

二分查找lower_bound() :https://blog.csdn.net/qq_40160605/article/details/80150252 https://www.jianshu.com/p/cb0d5488bb6a 去重函数: https://www.cnblogs.com/wangkundentisy/p/9033782.html https://www.cnblogs.com/hua-dong/p/7943983.html 原文地址:https://www.cnblogs.

JAVA学习笔记----二分查找递归

public class Main{     public static int rank(int key, int[] a){         return rank(key,a, 0 ,a.length -1 );     }     public static int rank(int key, int[] a, int lo , int hi){         if (lo > hi){System.out.println(" 找不到 ");return -1;}   

数据结构与算法实践 之 二分查找初识

今天起,我要对数据结构和基本的算法进行一些简单的复习,并在复习的基础上对其进行深入的挖掘.这篇文章先对二分查找进行一个简要的复习,在之后的文章中会对其进行深入的学习. 二分查找又叫折半查找,是最基本的几种查找算法之一.简单的看,二分法查找主要应用于在一个有序数列中进行元素的查找,其基本思路是,先用我们要查找的元素与这个有序数列中的中间位置的元素进行比较(在此我们姑且称这个元素为"中间位置元素"吧,至于这个元素怎么求我在后面会详细说明),如果相等,则返回这个"中间位置元素&qu

Java的二分查找

今天学习了二分查找,虽然代码简单,但还是要有必要,记录一下今天的学习的. 1 public class TestBrinarySeach { 2 public static void main(String[] args) { 3 int[] arr = {24,32,15,56,39,44,87,65,59}; 4 Arrays.sort(arr); 5 6 int value = 39;//要查找的值 7 8 System.out.println(Arrays.toString(arr));

【从零学习经典算法系列】分治策略实例——二分查找

1.二分查找算法简介 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半.折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn). 二分查找的优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且

算法学习一~分治法~二分查找,快速的找~

现在编程也算是走上门了,但是没有把算法掌握下来只能说自己还是门外汉,所以以后我们就开始努力的学习算法,现在把自己每天的学习分享在这里希望大家能喜欢,并且我也要在这里整理我一天的学习和思路,. 二分查找..大家经常需要在一个数组中寻找某个值.如果是一个已经拍好序的话那么可以很快的找到.我们考虑下暴力查找,就是a[n],中找一个m,那么最好时是o(1),最差时是0(n),最终平均情况就是长度n/2.这样的时间复杂度不算很高但是可以改进到logn的级别. 1 #include<stdio.h>//算

javascript学习6-练习之3二分查找算法

二分查找算法,对数据进行查找并且显示位置. 核心思想:将所查找数据与查询数组中间的数进行比较,findVal<midVal,则在左边进行二分查找,否则在右边进行二分查找递归调用 具体代码如下: 1 //二分查找 2 var string2=[1,3,42,88,123,143]; 3 var leftIndex=0; 4 var rightIndex=5; 5 function binarySearch(string2,findVal,leftIndex,rightIndex) 6 { 7 if

java数据结构学习(一)之二分查找

  二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了.为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62.直到猜中她所给的数. 下面给出我们猜1-100的数,key为33的过程: 只需7次就可以猜中答案.下面