算法交作业之查找
来源:互联网 发布:淘宝用淘客推广权重低 编辑:程序博客网 时间:2024/04/28 00:50
前言:
刚刚写了一篇发泄文,果不其然,心里面舒服很多。既然心情舒畅了,那就继续写下去吧。
假定:
我们假定查找的数据唯一存在,数组中没有重复的数据存在。
普通查找:
适用情景:
无特征,需要遍历整个范围才可以确定。
#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中的查找算法的使用。
0 0
- 算法交作业之查找
- 算法交作业之最大公约数
- 算法交作业之开篇(一)
- 算法交作业之循环和递归(二)
- 算法交作业之最大子序列问题
- 交作业
- 交作业
- 交作业
- 交作业
- 终于交作业了
- 前几天交的作业
- 不交作业
- 3.15交作业
- 算法作业(最优二叉查找树)
- 查找算法之顺序查找
- 查找算法之二分查找
- 查找算法之折半查找
- 查找算法之二叉排序树查找
- 配置VIM语法高亮及自动缩进
- 国产手机迈入关键时期,弯道超车指日可待?
- 基础篇-map的几种遍历方法
- [PHP]如何使用Mobile_Detect来判断访问网站的设备:安卓,平板,电脑
- Android 实现遮罩
- 算法交作业之查找
- mac修改host文件,让你的mac轻松上google
- 创业公司工程实践--注重迭代速度
- android 文件列表排序
- Linux环境下段错误的产生原因及调试方法小结
- 训练集(train set) 验证集(validation set) 测试集(test set)
- OVa Online Judge 学习笔记- AOAPC I Volume 1. Elementary Problem Solving Big Number
- 移动应用界面设计的尺寸设置及规范
- Objective-C关于数据处理