1)例:设数据集合data={2,5,7,8,10,14,16},升序有序,将某个关键字key,插入到数据集合中,使其依然有序。
①int JosephRing(int data[],int n,int key)
{
int i,j;
for(i=0;i<n && data[i]<key;i++);
for(j=n;j>i;j--)
{
data[j]=data[j-1];
}
data[j]=key;
return n+1;
}
②int JosephRing(int data[],int n,int key)
{
int i;
for(i=n-1;i>0 && data[i]>key;i--)
{
data[i+1]=data[i];
}
data[i+1]=key;
return n+1;
}
2)例:设data1和data2是两个升序列,将data1和data2和并成一个升序序列。
如:data1={2,3,4,5,8,10,12,14,15}
data2={3,3,5,6,7,8};
①int Merge(int data1[],int n1,int data2[],int n2,int data[])
{
int i,j,k;
i=j=k=0;
while(i<n1 && j<n2)//当两者都未完时
{
if(data1[i]<data2[j])
data[k++]=data1[i++];
else
data[k++]=data2[j++];
}
//当有一者进行判单完时,需要对两者进行判断
while(i<n1)
{
data[k++]=data1[i++];
}
while(j<n2)
{
data[k++]=data1[j++];
}
return k;
}
②int Merge(int data1[],int n1,int data2[],int n2,int data[])
{
int i,j,k;
i=j=k=0;
while(i<n1 && j<n2)
{
if(data1[i]<data2[j])
data[k++]=data1[i++];
else
data[k++]=data2[j++];
}
//当有一者进行判单完时,进行抽象
int *s=data1;
if(j<n2)
{
s=data2;
i=j;
n1=n2;
}
while(i<n1)
{
data[k++]=s[i++];
}
return k;
}
③int Merge(int data1[],int n1,int data2[],int n2,int data[])
{
int i=0,j=0,k=0;
while(i<n1 || j<n2)
{
/*
将data1的值给data的条件:
ⅰ.data2进行完
ⅱ.data2未完,data1未完且data1当前值小于data2当前值
其余情况data2值给data
*/
if(j==n2 || (i<n1 && data1[i]<data2[j]))
data[k++]=data1[i++];
else
data[k++]=data2[j++];
}
return k;
}