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

比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持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#的数据类型,数组、结构和枚举

    3. **数组**:数组是C#中存储固定数量相同类型元素的数据结构。它可以是一维、二维或多维的。例如,一维数组`int[] numbers = new int[5]`创建了一个包含五个整数的数组。数组元素可以通过索引访问,索引从0开始。 ...

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

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

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

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

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

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

    c#学习笔记.txt

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

    C#学习笔记(c#重点整理)精编版.docx

    以下是从标题和描述中提取的一些C#的关键知识点: 1. **面向对象特性**:C#支持面向对象编程的核心概念,包括封装、继承和多态。所有类型在C#中都被视为对象,这意味着每个类都有自己的属性和方法。 2. **.NET框架...

    北大青鸟 S2 深入.NET平台和C#编程总结

    .NET框架由两大部分组成:公共语言运行时(Common Language Runtime, CLR)和框架类库。CLR是.NET应用程序运行的基础,它提供了类型系统(Common Type System, CTS)、公共语言规范(Common Language Specification,...

    C#实验考查题目

    1. 数组操作:在C#中,数组是存储固定数量相同类型元素的数据结构。创建一个包含10个元素的int数组,并从键盘接收其值,需要使用`Console.ReadLine()`来读取用户输入,然后通过`int.TryParse()`或`int.Parse()`确保...

    C#中文转换成全拼

    在C#编程中,将中文转换为全拼是一项常见的任务,尤其在处理自然语言处理、文本分析或用户输入转换等场景。以下是一个简单的C#代码示例,它演示了如何实现基本的中文到拼音的转换,但请注意,该示例并不支持多音字。...

    c#考试重点.pdf

    【C#编程语言知识点】 ...以上是针对给定内容提取的C#编程语言的关键知识点,涵盖了类、继承、数组、类型转换、字符串操作、循环控制、面向对象特性、事件处理等多个方面。了解并掌握这些知识点对C#考试至关重要。

    c#多线程抓取网页内容

    在《爬虫/蜘蛛程序的制作(C#语言)》中已经介绍了爬虫程序的两个步骤:分析和下载。在单线程的程序中,两者是无法同时进行的。也就是说,分析时会造成网络空闲,分析的时间越长,下载的效率越低。反之也是一样,...

    C#算法函数:获取一个字符串中的最大长度的数字

    在C#编程中,有时我们需要从字符串中提取特定的信息,比如获取其中的最大长度的数字。这个任务可以通过编写算法函数来实现。本节我们将详细讲解如何使用C#编写一个函数,该函数可以从输入字符串中找到并返回最长的...

    C#中的常用函数.pdf

    在C#编程语言中,了解并熟练使用常用函数对于编写高效和可维护的代码至关重要。以下是一些在C#中常见的函数及其应用: 1. `DateTime` 类:这个类提供了处理日期和时间的能力。例如,可以创建一个表示当前时间的`...

    C#与MATLAB混合编程整理

    // 提取MATLAB返回的两个参数并转化为C#的矩阵 testz.testzclass st = new testz.testzclass(); MWArray[] max = st.testz(2); MWNumericArray x1 = (MWNumericArray)max[0]; MWNumericArray x2 = ...

    C#字符串函数.pdf

    1. `Compare` 和 `CompareOrdinal`: `Compare` 函数用于比较两个字符串的内容,考虑文化背景(如地区设置),判断它们是否相等。而`CompareOrdinal`函数则不考虑文化差异,直接基于Unicode编码进行比较。 2. `...

    C#学习之旅.docx

    以下是从文件中提取的知识点: 1. 基本输入输出:使用 `Console.WriteLine` 可以直接输入中文代码,文件后缀名为 `.cs`。使用 `label` 控件可以显示文字信息,使用 `combobox` 控件可以实现下拉菜单。 2. 字符串...

    C#常用公共类极其函数[借鉴].pdf

    在C#编程语言中,有一些常用的公共类和函数,它们为开发者提供了丰富的功能,使得代码编写更加便捷。这里我们将深入探讨三个关键的类别:算数类(System.Math),字符串类(System.String)以及转换类(System.Convert)。...

    1-第9周1

    在这些编程题目中,我们可以看到涉及C#语言的多个知识点,包括数组操作、排序、日期处理、字符串处理、以及二维数组的使用。接下来,我们将详细讨论这些知识点。 1. **数组操作**: - 在第一个编程题中,要求输入...

    浅谈C#中的值类型和引用类型

    在C#编程语言中,值类型和引用类型是两种主要的数据类型,它们在内存管理和操作方式上有显著区别。值类型包括简单类型(如int、bool、char等)、枚举和结构(struct),它们的变量直接存储实际数据。当对值类型进行...

    C#常用字符函数[借鉴].pdf

    在C#编程语言中,字符串处理是日常开发中不可或缺的部分。本文将深入探讨C#中常用的字符串函数,以及与日期时间、数值转换和会话管理相关的功能。 首先,字符串函数在C#中提供了多种操作字符串的方法。`Compare`和`...

Global site tag (gtag.js) - Google Analytics