CPP一个简单二分查找(查找元素是类对象)
2015-05-06 14:47
183 查看
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
/*
@@注意操作符与友元函数的使用!
@@name.c_str()//将string 转换成 const char*类型
*/
class Person
{
string name;
int age;
string addr;
int n ;
public:
Person(){}
Person(const char *n, int a, const char* ad) :name(n), age(a), addr(ad), n(0){ n++; }
~Person(){}
//小于
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 &Out, const Person&a)
{
Out << a.name << " ," << a.age << " ," << a.addr << endl;
return Out;
}
//getnum
int getnum()
{
return this->n;
}
//getname
string getname()
{
return this->name;
}
};
//查找
Person* binarysearch(Person *a, int n, string name)
{
if (n <= 0) return NULL;
int mid = n / 2;
Person t(name.c_str(), 0, "");//将string 转换成 const char*类型
if (a[mid] == t) return a + mid;//只比较name
if (t < a[mid]) return binarysearch(a, mid, name);//只比较name
return binarysearch(a + mid + 1, n - (mid + 1), name);
}
void main()
{
Person a[6] = {
Person("王五", 22, "山东"),
Person("赵四", 33, "河南"),
Person("张三", 44, "浙江") ,
Person("陈五2", 222, "山东"),
Person("徐四2", 332, "河南"),
Person("魏三2", 442, "浙江") };
for (int i = 0; i <6; i++)
{
for (int j = i + 1; j < 6; j++)
{
if (a[j] < a[i])
swap(a[j], a[i]);
}
}
for (int i = 0; i < 6; i++)
{
cout << a[i] << endl;
}
string name;
cout << "请出入名字:";
cin >> name;
Person *p = binarysearch(a, 6, name);
if (p!=NULL)
{
cout << *p << endl;
}
else
{
cout << "不存在!" << endl;
}
system("pause");
}
#include <stdlib.h>
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
/*
@@注意操作符与友元函数的使用!
@@name.c_str()//将string 转换成 const char*类型
*/
class Person
{
string name;
int age;
string addr;
int n ;
public:
Person(){}
Person(const char *n, int a, const char* ad) :name(n), age(a), addr(ad), n(0){ n++; }
~Person(){}
//小于
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 &Out, const Person&a)
{
Out << a.name << " ," << a.age << " ," << a.addr << endl;
return Out;
}
//getnum
int getnum()
{
return this->n;
}
//getname
string getname()
{
return this->name;
}
};
//查找
Person* binarysearch(Person *a, int n, string name)
{
if (n <= 0) return NULL;
int mid = n / 2;
Person t(name.c_str(), 0, "");//将string 转换成 const char*类型
if (a[mid] == t) return a + mid;//只比较name
if (t < a[mid]) return binarysearch(a, mid, name);//只比较name
return binarysearch(a + mid + 1, n - (mid + 1), name);
}
void main()
{
Person a[6] = {
Person("王五", 22, "山东"),
Person("赵四", 33, "河南"),
Person("张三", 44, "浙江") ,
Person("陈五2", 222, "山东"),
Person("徐四2", 332, "河南"),
Person("魏三2", 442, "浙江") };
for (int i = 0; i <6; i++)
{
for (int j = i + 1; j < 6; j++)
{
if (a[j] < a[i])
swap(a[j], a[i]);
}
}
for (int i = 0; i < 6; i++)
{
cout << a[i] << endl;
}
string name;
cout << "请出入名字:";
cin >> name;
Person *p = binarysearch(a, 6, name);
if (p!=NULL)
{
cout << *p << endl;
}
else
{
cout << "不存在!" << endl;
}
system("pause");
}
相关文章推荐
- 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有
- 二分查找,要注意的地方--写一个正确的二分查找,并不简单
- 利用二分查找在循环递增数组中检索一个元素
- 利用二分查找在循环递增数组中检索一个元素
- 在排序的数组中二分查找一个元素,返回在数组中它第一次出现的位置
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 二分查找一个不存在的元素,最多需要比较多少次?
- leetcode 162. Find Peak Element-查找峰元素|二分查找
- 冒泡排序,简单插入排序,快速排序,二分查找的JAVA实现
- 十八、二分查找 (由一个数找在数组中的位置)
- 编写一段程序,将含有整数元素的vector对象复制给一个整形数组;
- 编写一个程序,从标准输入中读取若干string对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词
- JavaScript 判断一个对象{}是否为空对象的简单方法
- 每天学一个算法1-二分查找
- dom4j-2.1基础 addElement 添加操作-在最后一个指定复杂元素中添加一个简单元素
- 如何向以json对象为元素的数组中追加一个新的元素
- 查找至少一个重复元素
- js 对象数组查找元素常用方法
- 一个简单的java对象序列化工具类
- 简单的面向对象思想,写一个传奇人物的属性