/* * Merge() 升序合并 * 有数据类型为整型的顺序表 La 和 Lb,其数据元素均按从小到大的升 * 序排列,编写一个算法将它们合并成一个表 Lc,要求 Lc 中数据元素也按升序排 * 列。 * 算法思路: * 依次扫描 La 和 Lb 的数据元素,比较 La 和 Lb 当前数据元素的 * 值,将较小值的数据元素赋给 Lc,如此直到一个顺序表被扫描完,然后将未完 * 的那个顺序表中余下的数据元素赋给 Lc 即可。 Lc 的容量要能够容纳 La 和 Lb * 两个表相加的长度。 */ public SeqList <int> Merge(SeqList <int> La, SeqList <int> Lb) //升序合并 { SeqList <int> Lc = new SeqList <int>(La.Maxsize + Lb.Maxsize); //初始化Lc int i = 0; //temp Ptr 3个 int j = 0; #region 两个表中都有数据元素 while ((i <= (La.GetLength() - 1)) && (j <= (Lb.GetLength() - 1))) { if (La[i] < Lb[j]) { Lc.Append(La[i++]); } else //(La[i] > Lb[j]) { Lc.Append(Lb[j++]); } } #endregion #region a表中还有数据元素 while (i <= (La.GetLength() - 1)) { Lc.Append(La[i++]); } #endregion #region b表中还有数据元素 while (j <= (Lb.GetLength() - 1)) { Lc.Append(Lb[j++]); } #endregion return(Lc); //算法的时间复杂度是 O(m+n), m 是 La 的表长, n 是 Lb 的表长。 }//升序合并
}//升序合并 /* * Purge() 净化 * [例 2-3] * 已知一个存储整数的顺序表 La,试构造顺序表 Lb,要求顺序表 Lb 中 * 只包含顺序表 La 中所有值不相同的数据元素。 * 算法思路: * 先把顺序表 La 的第 1 个元素赋给顺序表 Lb, * 然后从顺序表 La的第 2 个元素起, * 每一个元素与顺序表 Lb 中的每一个元素进行比较, * 如果不相同,则把该元素附加到顺序表 Lb 的末尾。 * 从表中删除相同数据元素的算法的 C#实现如下: */ public SeqList <int> Purge(SeqList <int> La) //净化 { SeqList <int> Lb = new SeqList <int>(La.Maxsize); //声明Lb Lb.Append(La[0]); //将a表中的第1个数据元素赋给b表 //依次处理a表中的数据元素 for (int i = 1; i <= La.GetLength() - 1; ++i) { int j = 0; #region 查看b表中有无与a表中相同的数据元素 for (j = 0; j <= Lb.GetLength() - 1; ++j) { #region 相同的数据元素 if (La[i].CompareTo(Lb[j]) == 0) { //CompareTo() //Equal() continue;//跳过 } #endregion #region 没有相同的数据元素,将a表中的数据元素附加到b表的末尾。 if (j > Lb.GetLength() - 1) //mean next { //没有相同的数据元素,将a表中的数据元素附加到b表的末尾。 Lb.Append(La[i]); } #endregion } #endregion } return(Lb); //算法的时间复杂度是 O(m + n), m 是 La 的表长, n 是 Lb 的表长。 } //净化
}//倒置 //存储整数的顺序表的倒置的算法实现如下: public void ReversSeqList(SeqList <int> L) { //重载方法 //倒置,思路,1条数组对半切成2条数组,循环下标指针交换 //0.5向上取整 int tmp = 0;//default(T) == 0; int len = L.GetLength(); for (int i = 0; i <= len / 2; ++i) { tmp = L[i]; L[i] = L[len - i]; L[len - i] = tmp; } }