数据结构和算法——算法 查找算法(二分查找法)实现

来源:互联网 发布:人工智能人才培养 编辑:程序博客网 时间:2024/06/12 08:42

1.算法:解决问题的方法


  算法实现在程序里一般表现为一个函数,形参是输入,返回值是输出,函数体是加工过程
  当然,cout<<也是输出,也可以输出到文件里


  特点:
  有输入输出(输入不一定是键盘输入的输入,输出也不定输出在屏幕上,也可是文件)
  有穷性
  可行性
  确定性

关心一个算法最主要的是正确性
  其次性能(时间,空间),时间复杂度,空间复杂度
  然后是可靠性(健壮性)

  算法数量级:N N^2  查找树logN
  log2 1024=10

2.二分法查找,折半查找

  前提是数组里的元素都排序好

  冒泡排序的复杂度是N^2

设计算法的方法:
  穷举法(暴力法) 每一个都试一试 看哪个最优
  贪心策略(局部最优) 当前状态下做好的步骤
  深度优先  广度优先
  分治法    把一个问题拆成几个小问题
  递归法    如果一个问题拆分成跟原来类似的小问题
  遗传算法
  神经网络
 

3.二分查找算法实现

  二分查找,有序数据,然后采用递归查找;只是用分治法

02binary.cpp

<span style="font-size:18px;">#include <iostream>using namespace std;class Person{string name;int age;string addr;public:Person(const char* n, int a, const char* ad):name(n),age(a),addr(ad){}friend bool operator<(const Person& a, const Person& b){return a.name<b.name;}friend bool operator==(const Person& a, const Person& b){return a.name==b.name;}friend ostream& operator<<(ostream& o, const Person& a){o << a.name << ':' << a.age << ',' << a.addr;return o;}};/*Person* binarysearch(Person* a, int n, const string& name)//递归实现二分{if(n<=0) return NULL;int mid = n/2;Person t(name.c_str(),0,"");if(a[mid]==t) return a+mid;if(t<a[mid]) return binarysearch(a,mid,name);return binarysearch(a+mid+1,n-(mid+1),name);} */Person* binarysearch(Person* a, int n, const string& name){int b=0, e=n-1;Person t(name.c_str(),0,"");while(b<=e){int mid = (b+e)/2;if(a[mid]==t) return a+mid;if(t<a[mid]) e = mid-1;else b = mid+1;}return NULL;} int main(){Person a[5]={Person("李鹏",21,"乌鲁木齐"),Person("钟玉龙",23,"大连"),Person("何军军",20,"重庆"),Person("蒲嗣良",16,"四川绵阳"),Person("王刚",18,"吉林通化")};for(int i=0; i<5; i++)for(int j=i+1; j<5; j++)if(a[j]<a[i])swap(a[j],a[i]);for(int i=0; i<5; i++)cout << a[i] << endl;string name;cout << "请输入姓名:";cin >> name;Person* p = binarysearch(a,5,name);if(p!=NULL) cout << *p << endl;else cout << "找不到" << endl;}</span>


0 0
原创粉丝点击