二分法的递归算法和迭代算法,算法作为有序表模板类的成
2009-12-09 18:44
225 查看
/*对半查找递归算法,算法作为有序表(ordered list)模板类的成员函数*/
#include<iostream>
using namespace std;
template<class T,int size>
class Orderedlist
{
private:
int maxsize;
int last;
T slist[size];
public:
Orderedlist()
{
last=-1;
maxsize=size;
}
int Binarysearch(T&x,int low, int high);
bool Insert(T &elem,int i);
void print();
};
template<class T,int size>
int Orderedlist<T,size>::Binarysearch(T & x,int low, int high)
{
int mid=-1;
if(low<=high)
{
mid=(low+high)/2;
if(slist[mid]<x)
{
mid=Binarysearch(x,mid+1,high);
}
else if(x<slist[mid])
{
mid=Binarysearch(x,low,mid-1);
}
}
return mid;
}
template<class T,int size>
bool Orderedlist<T,size>::Insert(T& elem,int i)
{
int j;
if(i<0 || i>last+1 || last==maxsize-1)
{
cout<<"添加数据失败"<<endl;
return false;
}
else
{
last++;
for(j=last;j>i;j--)
slist[j]=slist[j-1];
}
slist[i]=elem;
return true;
}
template<class T,int size>
void Orderedlist<T,size>::print()
{
int i;
for(i=0;i<=last;i++)
{
slist[i].show();
if(i%5==4)
{
cout<<endl;
}
}
}
class Element{
private:
int key;
public:
bool operator<(Element ele)
{
return key<ele.key;
}
void putkey(int k)
{
key=k;
}
void show()
{
cout<<key<<'/t';
}
};
int main()
{
const int h=19;
int i,k=37;
Orderedlist<Element,100>ord;
int a[h]={67,61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,2};//降序
Element n[h],elem;
for(i=0;i<h;i++)
n[i].putkey(a[i]);
for(i=0;i<h;i++)//始终从0号元素插入,建立升序顺序表
ord.Insert(n[i],0);
elem.putkey(k);
ord.print();
cout<<endl;
i=ord.Binarysearch(elem,0,h-1);
if(i != -1)
{
cout<<"整数"<<k<<"在表中的下标是"<<i<<endl;
}
else
{
cout<<"您要查找的数据不在表中"<<endl;
}
return 0;
}
/*template<class T,int size>//二分法的迭代算法
int Orderedlist<T,size>::Binarysearch(T& x)const
{
int high=last,low=0,mid;
if(last==-1)
return -1;
while(low<=high)
{
mid=(low+high)/2;
if(x<slist[mid])
{
high=mid-1;
}
else if(slist[mid]<x)
{
low=mid+1;
}
else
return mid;
}
if(slist[mid]!=x)
mid=-1;
return mid;
}*/
#include<iostream>
using namespace std;
template<class T,int size>
class Orderedlist
{
private:
int maxsize;
int last;
T slist[size];
public:
Orderedlist()
{
last=-1;
maxsize=size;
}
int Binarysearch(T&x,int low, int high);
bool Insert(T &elem,int i);
void print();
};
template<class T,int size>
int Orderedlist<T,size>::Binarysearch(T & x,int low, int high)
{
int mid=-1;
if(low<=high)
{
mid=(low+high)/2;
if(slist[mid]<x)
{
mid=Binarysearch(x,mid+1,high);
}
else if(x<slist[mid])
{
mid=Binarysearch(x,low,mid-1);
}
}
return mid;
}
template<class T,int size>
bool Orderedlist<T,size>::Insert(T& elem,int i)
{
int j;
if(i<0 || i>last+1 || last==maxsize-1)
{
cout<<"添加数据失败"<<endl;
return false;
}
else
{
last++;
for(j=last;j>i;j--)
slist[j]=slist[j-1];
}
slist[i]=elem;
return true;
}
template<class T,int size>
void Orderedlist<T,size>::print()
{
int i;
for(i=0;i<=last;i++)
{
slist[i].show();
if(i%5==4)
{
cout<<endl;
}
}
}
class Element{
private:
int key;
public:
bool operator<(Element ele)
{
return key<ele.key;
}
void putkey(int k)
{
key=k;
}
void show()
{
cout<<key<<'/t';
}
};
int main()
{
const int h=19;
int i,k=37;
Orderedlist<Element,100>ord;
int a[h]={67,61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,2};//降序
Element n[h],elem;
for(i=0;i<h;i++)
n[i].putkey(a[i]);
for(i=0;i<h;i++)//始终从0号元素插入,建立升序顺序表
ord.Insert(n[i],0);
elem.putkey(k);
ord.print();
cout<<endl;
i=ord.Binarysearch(elem,0,h-1);
if(i != -1)
{
cout<<"整数"<<k<<"在表中的下标是"<<i<<endl;
}
else
{
cout<<"您要查找的数据不在表中"<<endl;
}
return 0;
}
/*template<class T,int size>//二分法的迭代算法
int Orderedlist<T,size>::Binarysearch(T& x)const
{
int high=last,low=0,mid;
if(last==-1)
return -1;
while(low<=high)
{
mid=(low+high)/2;
if(x<slist[mid])
{
high=mid-1;
}
else if(slist[mid]<x)
{
low=mid+1;
}
else
return mid;
}
if(slist[mid]!=x)
mid=-1;
return mid;
}*/
相关文章推荐
- 二分法的递归算法和迭代算法,算法作为有序表模板类的成
- Python有序查找算法之二分法实例分析
- 有序符号表(数组实现,JAVA,算法(四),二分法)
- [ZZ]迭代算法与递归算法
- KNN 算法的python实现 迭代训练方式,将最近的测试样例作为训练样例扩大训练集
- 递归算法与迭代算法总结
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 迭代用在有序数组二分法查找中,递归的二分法查找更简洁,但速度可能会慢一点
- 【算法】找出有序数组中,绝对值最小的一个(二分法)
- 迭代算法与递归算法
- 斐波那契数列的递归算法和迭代算法
- 算法学习记录七(C++)--->二分法找有序旋转数组最小值
- 二分法搜索迭代和递归算法
- 已知顺序表L递增有序,写一算法,将X插入到线性表的适当位置,以保持线性表的有序
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 求两个等长有序数组的中位数的logN算法 分治法
- 第九章中位数和顺序统计学之“查找第i小的元素(迭代版)平均运行时间为O(n)算法”(练习9.2-3)
- HNCU1324: 算法2-2:有序线性表的有序合并
- 使用迭代的方法实现简单算法
- 简单归并算法-有序数组合并算法实现