`
yyw84
  • 浏览: 79016 次
社区版块
存档分类
最新评论

比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]

阅读更多

        有时候我们需要从两个不同数组中提取出相同的部分的数组或者计算有多少个相同的项,这个算法刚好能派上用场,

实现方案:
1、将两个数组按从小到大排序;
2、遍历第一个数组 array1,跟第二个数组 array2 做比较;
3、如果找到相等的则提取出该数据并且记录下 array2 的下标到临时变量 t,下次循环则从 array2[t+1] 开始遍历 array2;
4、如果没有匹配到相等的而且 array2[t] 大于与 array1 对比的数据时, 记下 array2 当前下标到临时变量 t,下次循环则从 array2[t] 开始;

经过测试,该算法比“最笨”的作法无法在数组以何种方式排序都要强,如果量越多会越明显,有点可惜的是暂时只能使用在 Int[] 上,有时间再想一下其它数据类型的比较

获取两个整型数组中相等项的集合
<!---->获取两个整型数组中相等项的集合#region  获取两个整型数组中相等项的集合

/**//// <summary>
/// 获取两个整型数组中相等项的集合
/// </summary>
/// <param name="array1"></param>
/// <param name="array2"></param>
/// <returns></returns>
public static int[] CompareEquation(int[] array1, int[] array2)
{
    
int i1, i2;
    
// 记录第二个数组上一次匹配到的位置
    int t = 0;
    
// 记录相同的项
    List<int> equal = new List<int>();

    
int[] sort1 = BubbleSort(array1);
    
int[] sort2 = BubbleSort(array2);

    
for (int i = 0; i < sort1.Length; i++)
    
{
        i1 
= sort1[i];

        
for (int j = t; j < sort2.Length; j++)
        
{
            i2 
= sort2[j];

            
if (i2 == i1)
            
{
                equal.Add(i2);
                
// 下次比较从下一位开始
                t = j + 1;
            }

            
else if (i2 > i1)
            
{
                
// 下次比较继续从这里开始
                t = j;
                
break;
            }

        }

    }


    
return equal.ToArray();
}


#endregion

冒泡法排序(非原创)
<!---->冒泡法排序(非原创)#region 冒泡法排序(非原创)

/**//// <summary>
/// 冒泡法排序
/// </summary>
/// <returns>排序结果: 从小到大(升序)</returns>
/// <see cref="http://www.aspcool.com/lanmu/browse1.asp?ID=1223&bbsuser=csharp"/>
public static int[] BubbleSort(int[] R)
{
    
int i, j, temp;
    
//交换标志 
    bool exchange;
    
//最多做R.Length-1趟排序 
    for (i = 0; i < R.Length; i++)
    
{
        
//本趟排序开始前,交换标志应为假 
        exchange = false;
        
for (j = R.Length - 2; j >= i; j--)
        
{
            
//交换条件 
            if (R[j + 1< R[j])
            
{
                temp 
= R[j + 1];
                R[j 
+ 1= R[j];
                R[j] 
= temp;
                
//发生了交换,故将交换标志置为真 
                exchange = true;
            }

        }

        
//本趟排序未发生交换,提前终止算法 
        if (!exchange)
        
{
            
break;
        }

    }


    
return R;
}


#endregion

测试结果:



所谓的最笨的方法:

自我感觉最笨的作法
<!---->计算两个整型数组中数值相等的数量(最笨的方法)#region 计算两个整型数组中数值相等的数量(最笨的方法)

/**//// <summary>
/// 计算两个整型数组中数值相等的数量(最笨的方法)
/// </summary>
/// <param name="array1"></param>
/// <param name="array2"></param>
/// <returns></returns>
public static int[] CompareEquation1(int[] array1, int[] array2)
{
    List
<int> equal = new List<int>();

    
foreach (int i1 in array1)
    
{
        
foreach (int i2 in array2)
        
{
            
if (i1 == i2)
            
{
                equal.Add(i1);
            }

        }

    }

    
return equal.ToArray();
}


#endregion

从图中可以看到运行效率有了很大的提升,
以上只是不成熟的解决方案,欢迎各位一起来讨论!

相关代码下载
分享到:
评论

相关推荐

    C# 实现一个字模点阵提取程序 demo 源代码 内附两个实例

    在本文中,我们将深入探讨如何使用C#编程语言实现一个字模点阵提取程序,以及相关的技术要点。字模点阵提取是计算机图形学和嵌入式系统领域中常见的任务,尤其是在显示汉字或其他字符时,点阵屏和液晶显示器的使用尤...

    c#实现从字符串数组中把数字的元素找出来

    C#是一种强类型的、面向对象的编程语言,它提供了多种方法来实现从字符串数组中提取数字元素。下面,我们将详细介绍如何使用C#实现从字符串数组中提取数字元素。 为什么需要从字符串数组中提取数字元素 在实际开发...

    C#图像处理实践——图片不同提取

    5. **图像区域提取**:有时我们只对图像的特定部分感兴趣,可以使用Rectangle结构定义感兴趣区域,并用LockBits方法进行高效访问。LockBits允许你直接操作图像的原始字节数组,这对于大量像素处理非常有效。 6. **...

    利用C#实现卷积运算

    - **类型安全性与泛型使用**:在实际开发中,可能需要处理不同类型的数组,此时可以考虑使用C#的泛型特性,使函数更加灵活和类型安全。 总之,C#中实现卷积运算不仅涉及对数学原理的理解,还需要考虑到编程技巧与...

    c#字符串及数组操作ehk[文].pdf

    在C#编程语言中,字符串和数组是两个非常基础且重要的概念。字符串是表示文本的数据类型,而数组则是一种能够存储同一类型数据集合的数据结构。本文档“c#字符串及数组操作ehk[文].pdf”主要介绍了如何在C#中进行...

    C#二维数组(答案).docx

    首先,二维数组在C#中是通过声明一个具有两个维度的数组来创建的。例如,创建一个4行3列的二维数组可以使用如下语句: ```csharp int[,] arr = new int[4, 3]; ``` 此时,`arr`已经是一个4行3列的二维数组实例,但...

    C# IEEE754浮点数转换示例代码

    例如,下面给出了两个函数`HexToFloat`和`IEEE754Float`,它们分别用于从十六进制字符串和字节数组中提取浮点数值。 ```csharp public static string HexToFloat(string strHex) { // ... (代码省略) } public ...

    C# 获取汉字首字母

    通过以上介绍和示例代码,我们可以看到在C#中获取汉字拼音首字母的方法其实并不复杂,只需要正确理解和运用字符编码知识即可实现。这种方法适用于多种应用场景,特别是在需要对中文数据进行快速排序和检索的情况下...

    C#实现简单的串

    在这个特定的场景中,我们关注的是"C#实现简单的串",这里的“串”指的是计算机科学中的字符串,即一连串字符的集合。在C#中,字符串是基于.NET框架的System.String类来处理的。 字符串在数据结构中占据着重要地位...

    C#基本语法部分

    数组是一种存储相同类型数据的容器,在C#中,数组的操作非常灵活。 **示例代码:** ```csharp int[] numbers = new int[5] { 1, 2, 3, 4, 5 }; // 初始化数组 numbers[0] = 10; // 修改数组元素 int length = ...

    C#图像灰度值提取 且实习毫米到像素的转换

    在C#编程环境中,开发图像处理应用是一项常见的任务,特别是在VS2008这样的集成开发环境中。本项目专注于两个核心概念:图像的...在VS2008中,使用适当的库和算法,可以方便地实现这些功能,为各种实际应用提供支持。

    C程序设计简明教程C语言基础字符串与数组PPT课件.pptx

    `compare`方法通常在C++或.NET框架中使用,它允许我们比较两个字符串的顺序。`string.Compare(str1, str2)`会返回一个整数值,根据`str1`和`str2`的相对大小:如果`str1`大于`str2`则返回正数,相等返回0,小于则...

    C#语言基础理解.doc

    这个过程涉及到内存的分配和类型转换,是C#语言类型系统的一个重要组成部分。 除了基础的数据类型之外,数组和字符串是C#中非常常用的数据结构。数组允许我们创建和使用固定大小的顺序集合,可以通过单一变量名访问...

    C# 常用常用算法

    快速排序是一种高效的排序算法,采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 #### 实现代码解析 1. **分区函数 (Partition Function)** - **功能**:选择一个基准值(这里...

    C# 实现的格式化输入类。实现了C++的Scanf

    在C#编程语言中,与C++的`scanf`函数类似的功能主要通过`Console.ReadLine()`、`int.TryParse()`、`double.TryParse()`等方法来实现。然而,为了在C#中获得与C++`scanf`更接近的体验,我们可以创建一个自定义的类,...

    c#学习笔记.txt

    (但是请注意:两个不同但结构上等效的委托类型的实例可能会比较为相等),准确地说,两个具有相同参数列表、签名和返回类型的不同的委托类型被认为是不同的委托类型。委托实例所封装的方法集合称为调用列表。 5, ...

    c# rgb565 转 rgb24

    ### C# 中 RGB565 转换为 RGB24 的实现原理及代码解析 在图像处理领域,不同的颜色模式及其之间的转换是常见的需求之一。RGB565 和 RGB24 是两种常用的颜色格式。RGB565 主要用于节省存储空间,而 RGB24 提供了更...

    c#的试题库武汉理工大学

    根据题目要求,以下是从标题、描述以及部分内容中提取并详细阐述的相关知识点: ### C#语言程序设计知识点概览 #### 1\. .NET Framework的组成 .NET Framework 是一个由 Microsoft 开发的应用程序运行环境,主要由...

    c#实现canny

    ### C# 实现 Canny 边缘检测算法详解 Canny 边缘检测算法是一种广泛应用于图像处理领域的经典边缘检测技术。它通过一系列步骤来识别图像中的边界...通过这种方式,可以从输入图像中有效地提取出清晰且准确的边缘信息。

Global site tag (gtag.js) - Google Analytics