--------------------------------------------------------------------------------
标题: 查找相同项的双螺旋匹配算法
作者: 叶飞虎
日期: 2012.07.16
--------------------------------------------------------------------------------
已知:
有两个列表 List1 和 List2, 列表中没有相同项且已经排序
问题:
输出两个列表的所有相同项
双螺旋匹配算法示例如下:
// 二分查找函数 bool Find(long* AList, long AFrom, long ATo, long AValue, long& AIndex) { // 初始化 bool result = false; long intMid; // 循环比较 while (AFrom <= ATo) { intMid = (AFrom + ATo) >> 1; if (AList[intMid] == AValue) { result= true; AFrom = intMid; break; } else if (AList[intMid] < AValue) AFrom = intMid + 1; else ATo = intMid - 1; } // 最近索引项 AIndex = AFrom; // 返回结果 return result; } // 输出相同项, 返回相同项数 long OutSame(long* AList1, long* AList2, long ACount1, long ACount2) { // 初始化 long result = 0; long intTo1 = ACount1 - 1; long intTo2 = ACount2 - 1; long intNo1 = 0; long intNo2 = 0; long intIndex; // 循环查找 while ((intNo1 < ACount1) && (intNo2 < ACount2)) if (AList1[intNo1] == AList2[intNo2]) { // 输出项: Output(...); intNo1++; intNo2++; result++; } else if (AList1[intNo1] < AList2[intNo2]) { if (Find(AList1, intNo1 + 1, intTo1, AList2[intNo2], intIndex)) { // 输出项: Output(...); intNo1 = intIndex + 1; intNo2++; result++; } else { intNo1 = intIndex; intNo2++; } } else if (Find(AList2, intNo2 + 1, intTo2, AList1[intNo1], intIndex)) { // 输出项: Output(...); intNo2 = intIndex + 1; intNo1++; result++; } else { intNo2 = intIndex; intNo1++; } // 返回结果 return result; }