比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]
有时候我们需要从两个不同数组中提取出相同的部分的数组或者计算有多少个相同的项,这个算法刚好能派上用场,实现方案:
1、将两个数组按从小到大排序;
2、遍历第一个数组 array1,跟第二个数组 array2 做比较;
3、如果找到相等的则提取出该数据并且记录下 array2 的下标到临时变量 t,下次循环则从 array2 开始遍历 array2;
4、如果没有匹配到相等的而且 array2 大于与 array1 对比的数据时, 记下 array2 当前下标到临时变量 t,下次循环则从 array2 开始;
经过测试,该算法比“最笨”的作法无法在数组以何种方式排序都要强,如果量越多会越明显,有点可惜的是暂时只能使用在 Int[] 上,有时间再想一下其它数据类型的比较
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee;">http://www.agoit.com/Images/OutliningIndicators/ContractedBlock.gifhttp://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gif获取两个整型数组中相等项的集合<span style="display: none;">
<!---->http://www.agoit.com/Images/OutliningIndicators/ContractedBlock.gifhttp://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gif获取两个整型数组中相等项的集合#region 获取两个整型数组中相等项的集合
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif/**//// <summary>
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif/// 获取两个整型数组中相等项的集合
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif/// </summary>
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif/// <param name="array1"></param>
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif/// <param name="array2"></param>
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif/// <returns></returns>
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifpublic static int[] CompareEquation(int[] array1, int[] array2)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gifhttp://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif int i1, i2;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif // 记录第二个数组上一次匹配到的位置
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif int t = 0;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif // 记录相同的项
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif List<int> equal = new List<int>();
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif int[] sort1 = BubbleSort(array1);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif int[] sort2 = BubbleSort(array2);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif for (int i = 0; i < sort1.Length; i++)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif http://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif i1 = sort1;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif for (int j = t; j < sort2.Length; j++)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif http://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif i2 = sort2;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif if (i2 == i1)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif http://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif equal.Add(i2);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif // 下次比较从下一位开始
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif t = j + 1;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif else if (i2 > i1)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif http://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif // 下次比较继续从这里开始
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif t = j;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif break;
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif return equal.ToArray();
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif}
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockEnd.gif#endregion
页:
[1]