算法:将两个顺序表合并成一个顺序表
要求:
//把两个无序表合成一个有序表
//例如:把la和lb合成lc。
la:1,5,2,3,9
lb:6,8,4,7
lc:1,2,3,4,5,6,7,8,9
我的做法:
1.设两个无序表为la和lb,因为顺序表是无序的,而且顺序表难以直接排序,所以我先把la和lb弄成数组a和数组b,因为数组排序十分容易,可以直接采用内置的Array.Sort()方法直接排出来。
2.再把排好的数组写入另外两个新顺序表la2和lb2,这样它们就是两个有序表了。
3.合并利用循环来搞定:
(1)两表都有值的情况下,将两表的第一个值相比较,将控制循环的变量i,j设为0;小的值插入lc并使该表对应的变量自增。
(2)表la2元素用完,直接在表lc后插入lb2的全部元素。
(3)表lb2元素用完,直接在表lc后插入la2的全部元素。
4*.其实还有一种思路就是先把两个无序表随便合成一个无序表,然后再转成数组,再重排序,再把数组插入顺序表中,这个思路可能更简单一点,这里就不再展示代码了。
算法的代码如下(c#):
注:过程中用到了顺序表的取值(GetE)和插入(Insert)方法,由于比较基础,故在此不再给出。
public void Merge(Sqlist la,Sqlist lb)
{
int []a=new int[la.length];
for(int m=0; m<la.length; m++)
a[m]=Convert.ToInt32(la.GetE(m+1));
int []b=new int[lb.length];
for(int m=0; m<lb.length; m++)
b[m]=Convert.ToInt32(lb.GetE(m+1));
Array.Sort(a);
Array.Sort(b);
Sqlist la2;
Sqlist lb2;
for(int m=1; m<a.length+1; m++)
la2.Insert(m, a[m-1]);
for(int m=1; m<b.length+1; m++)
lb2.Insert(m, b[m-1]);
int i=0;int j=0;int k=0;
while (i < la2.length && j < lb2.length)
{
if (Convert.ToInt32(la2.Elements[i]) <= Convert.ToInt32(lb2.Elements[j]))
this.Insert(k++, la2.Elements[i++]);
else
this.Insert(k++, lb2.Elements[j++]);
}
while (j < lb2.length)
this.Insert(k++, lb2.Elements[j++]);
while (i < la2.length)
this.Insert(k++, la2.Elements[i++]);
}