算法交作业之查找

前言:

刚刚写了一篇发泄文,果不其然,心里面舒服很多。既然心情舒畅了,那就继续写下去吧。

假定:

我们假定查找的数据唯一存在,数组中没有重复的数据存在。

普通查找:

适用情景:

无特征,需要遍历整个范围才可以确定。

#include <iostream>
#include <assert.h>
//普通的查找算法。
template<unsigned n>
int Find_Array(const int(&arr)[n], const int& value){
//使用数组类型引用和模版。
    //查找成功返回下标,否则返回-1.
    if (arr == nullptr || n == 0)
        return -1;
    for (unsigned index = 0; index < n;++index)
    if (arr[index] == value)
        return index;
    return -1;
}
//实现为类模版
template<unsigned n,typename T>
int Find_nArray(const T(&arr)[n], const T& value){
    if (arr == nullptr || n == 0)
        return -1;
    for (unsigned index = 0; index < n;++index)
    if (arr[index] == value)
        return index;
    return -1;
}
int main(){
    int arr[10] = { 1, 2, 3, 4, 5 };
    assert(Find_Array(arr, 10) == -1);
    int arr2[3] = { 1, 2, 3 };
    assert(Find_Array(arr2, 2) == 1);
    char arr3[3] = "hi";
    assert(Find_nArray(arr3, ‘i‘)==1);
    system("pause");
    return 0;
}
//时间复杂度为O(n);最少查找1次,最多查找n次。

二分查找:

#include <iostream>
#include <functional>
//查找成功返回下标。
template<unsigned length>
int Binary_Find(const int(&arr)[length], const int& value){
    auto beg = 0, end = length - 1;
    while (beg <= end){
        auto mid = beg +((end - beg)>>1);//采用移位运算符。
        if (arr[mid] == value)
            return mid;
        else if (arr[mid] > value)
            end = mid - 1;
        else
            beg = mid + 1;
    }
    return -1;
}
//比较下面的写法
template<unsigned length>
int Binary_Find_(const int(&arr)[length], const int& value){
    auto beg = 0, end = length;//此处的end=length;
    while (beg < end){//对比
        int mid = beg + ((end - beg)>>1);
        if (arr[mid] == value)
            return mid;
        else if (arr[mid]<value)
            beg= mid+1;
        else
            end = mid;//对比
    }
    return -1;
}
//递归
int Binary_Find(int* p,int beg,int end,const int& value){
    if (beg < end){
        auto mid = beg + ((end - beg) >> 2);
        if (p[mid] == value)
            return mid;
        else if (p[mid]>value)
            return Binary_Find(p, beg, mid, value);
        else
            return Binary_Find(p, mid + 1, end, value);
    }
    return -1;
}
//用函数模版实现
template<unsigned length,typename T>
int Binary_Find(const T(&arr)[length], const T& value){
    auto beg = 0, end = length;
    equal_to<T> is_equal; //标准库的可调用对象。
    greater<T> is_greater;
    while (beg<end){
        auto mid = beg + ((end - beg) >> 1);
        if (is_equal(arr[mid], value))
            return mid;
        else if (is_greater(arr[mid], value))
            end = mid;
        else
            beg = mid + 1;
    }
    return -1;
}
int main(){
    int arr[5] = { 1, 2, 3, 4, 5 };
    //std::cout << Binary_Find(arr, 5)
    std::cout<<Binary_Find(arr,0,5,99);
    system("pause");
    return 0;
}

总结:

突然好累,所以留待下次继续补充吧。

有机会会补充二叉树中的递归查找和哈希表中的查找和STL中的查找算法的使用。

时间: 2024-10-07 13:30:22

算法交作业之查找的相关文章

算法交作业(一)

首先解释下标题的含义:在网上看了一位大牛写的基础算法相关的博文,感觉自己不是天赋异禀,所以决定自己实现一遍当作交作业. 开篇: 今天这篇博文是关于数组查找的,很简单. 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多人认为,算法是数学的内容,学起来特别麻烦.我们不能认为这种观点是错误的.但是我们也知道,软件是一种复合的技术,如果一个人只知道算法,但是不能用编程语言很好地实现,那么再优秀的算法也不能发挥作用.一个人只有有了很好的计算机知识和数学知识,才

算法交作业之循环和递归(二)

说明: 循环是学习编程过程中的不可或缺的一部分.同时递归同循环有着千丝万缕的关系. 求和函数示例: //求0到n的和.求和失败返回-1.否则返回结果. #include <iostream> //最常见的循环写法. long long Sum(unsigned int&& n){ long long sum = 0; for (unsigned index = 1; index <n+1; ++index) sum += index; return sum; } //递归

算法交作业之最大公约数

今天写一下最大公约数算法,英文简称为Gcd算法. 1.递归解法: /*书上并没有给出递归的解法,可能是觉得这个解法不是很完美,但是给出来就当学习下递归.*/ int Gcd(unsigned num1, unsigned num2){ if (num1 == 0 || num2 == 0)//算法基于欧几里德的算法. return (num1 > num2) ? num1 : num2; return Gcd(num2, num1%num2); } //代码写的很短小,但是效率可能不是很高 //

算法交作业之最大子序列问题

最近看<数据结构与算法分析>一书,书中提供的一些算法太棒了,忍不住动手实现了下.有错误请指出,谢谢. 最大子序列问题求解: 1.第一种解法: int MaxSubSequence(const int array[], int length){ if (length < 0) //数组长度不可以为0. return 0; int MaxSum = 0,ThisSum; for (int i = 0; i < length; ++i){ for (int j = i; j < l

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

图同构哈希算法实现 (作业)

*/--> 图同构哈希算法实现 (作业) Table of Contents 代码 例子 1 例子 2 例子 3 例子 4 例子 5 例子 6 例子 7 不是同构 例子 8 不是同构 例子 9 不是同构 例子 10 不是同构 测试数据和测试图片参考地址 Hash 函数除了做为 Hash 表的辅助工具,在单独使用的时候可以实现判断两个数据是否相同或等价 代码 // CreateTime: 2015-05-15 21:24:47 #include <iostream> #include &l

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

算法——基础篇——二分查找

     二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.     首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

算法5-1:平衡查找树之二三树

平衡查找树的目标是实现查找.插入.删除操作在最坏情况下的复杂度均为logN. 本节将介绍二三查找树. 二三树中有两种节点: 二节点对应一个键,有两个子节点 三节点对应两个键,有三个子节点 二三查找树非常平衡,每个空节点到根节点的距离都是一样的 . 查找操作 在二三树中查找一个键的时候有以下规则: 如果是二节点,二节点对应1个值,如果要查找的值比该节点对应的值小,就往左侧深入,反之亦成 如果是三节点,三节点对应2个值,如果比两个值都小,就往左侧深入,如果介于两个值之间,就往中间深入,如果比两个值都