顺序串二路归并,并按从小到大排序
#include <iostream>
using namespace std;
const int MaxSize=100; //顺序表的大小
template <typename T> class SqList;
template <typename T> void move2(SqList<T> &L);
template <typename T> istream& operator >> (istream &in, SqList<T> &R);
template <typename T> ostream& operator << (ostream &out, SqList<T> &R);
template <typename T> void union1(SqList<T>&L,SqList<T>&K);
template <typename T>
class SqList //顺序表类
{
T *data; //存放顺序表中元素
int length; //存放顺序表的长度
public:
SqList(); //构造函数
~SqList(); //析构函数
void CreateList( ); //建立顺序表,当输入为EOF时,结束输入
void DispList(); //输出顺序表L中所有元素
int ListLength(); //求顺序表的长度
bool GetElem(int i, T &e); //求顺序表中某序号的元素值
int LocateElem(T e); //按元素值查找其序号
bool ListInsert(int i, T e); //插入数据元素
bool ListDelete(int i); //删除数据元素
void reverse();
void move();
friend void move2<>(SqList<T> &L);
friend istream& operator >><> (istream &in, SqList<T> &R);
friend ostream& operator <<<> (ostream &out, SqList<T> &R);
friend void union1<>(SqList<T>&L,SqList<T>&K);
};
//-----------------顺序表的基本运算算法--------------------------------
template <typename T>
SqList<T>::SqList() //构造函数
{
data=new T[MaxSize]; //为data分配长度为MaxSize的空间
length=0; //初始时置length为0
}
template <typename T>
SqList<T>::~SqList() //析构函数
{
delete [] data; //释放空间
}
template <typename T>
void SqList<T>::CreateList( ) //由a中的元素建立顺序表
{ int i=0;
T x;
cin>>x;
while(x!=-1)
{data[i++]=x;
cin>>x;} //将a的每个元素存放到data元素中
length=i;
}
template <typename T>
void SqList<T>::DispList() //输出顺序表中所有元素
{ int i;
if (length > 0)
{
for (i=0; i<length; i++) //扫描顺序表中各元素值
cout << data[i] << " ";
cout << endl;
}
}
template <typename T>
int SqList<T>::ListLength() //求顺序表的长度
{
return length;
}
template <typename T>
bool SqList<T>::GetElem(int i, T &e) //求顺序表中某序号的元素值
{ if (i < 1 || i > length)
return false; //参数错误时返回false
e=data[i - 1]; //取元素值
return true; //成功找到元素时返回true
}
template <typename T>
int SqList<T>::LocateElem(T e) //按元素值查找其序号
{ int i=0;
while (i < length && data[i]!=e)
i++; //查找元素e
if (i>=length) //未找到时返回0
return 0;
else
return i + 1; //找到后返回其逻辑序号
}
template <typename T>
bool SqList<T>::ListInsert(int i, T e) //插入数据元素
{ int j;
if (i<1 || i>length+1)
return false; //参数错误时返回false
for (j=length; j>=i; j--) //将data[i-1]及后面元素后移一个位置
data[j]=data[j-1];
data[i-1]=e; //插入元素e
length++; //顺序表长度增1
return true; //成功插入返回true
}
template <typename T>
bool SqList<T>::ListDelete(int i) //删除数据元素
{ int j;
if (i<1 || i>length) //参数错误时返回false
return false;
for (j=i-1; j<length-1; j++) //将data[i]之后的元素前移一个位置
data[j]=data[j+1];
length--; //顺序表长度减1
return true; //成功删除返回true
}
//---------------------------------------------------------------------
template <typename T>
void move2(SqList<T> &L)
{
int i=0, j=L.length-1;
T pivot=L.data[0]; //以data[0]为基准
while (i<j)
{ while (j>i && L.data[j]>pivot)
j--; //从右向左扫描,找≤pivot的data[j]
L.data[i]=L.data[j]; //将其放入data[i]处
while (i<j && L.data[i]<=pivot)
i++; //从左向右扫描,找>pivot的记录data[i]
L.data[j]=L.data[i]; //将其放入data[j]处
}
L.data[i]=pivot; //放置基准
}
#include"Sqlist.h"
template <typename T>
istream& operator >> (istream &in, SqList<T> &R)
{
int i=0;
T x;
in>>x;
while(x!=-1)
{
R.data[i]=x;
i++;
in>>x;
}
R.length=i;
return in;
}
template <typename T>
ostream& operator << (ostream &out, SqList<T> &R)
{
int i;
if (R.length > 0)
{
for (i=0; i<R.length; i++)
out << R.data[i] << " ";
out << endl;
}
return out;
}
template <typename T>
void union1(SqList<T> &L,SqList<T> &K)
{
int l,k;
int i=1;
T j=0;
k=K.ListLength();
while(i<=k)
{
l=L.ListLength();
K.GetElem(i,j);
if(L.LocateElem(j)==0)
{
L.ListInsert(l+1,j);
}
i++;
}
}
int main()
{
SqList<int> LA;
SqList<int> LB;
cin>>LA;
cin>>LB;
union1(LA,LB);
cout<<LA;
return 0;
}