两个相同类型已排序数据进行合并,虽然list数组中有AddRange方法,但它只是把第二个数组从第一个数组末尾插入,假如两个数组有重复数据,保存进去。
还有Union方法合并去重,首先会从第一个数组进行检查然后再把第二个数组数据从第一个数组依次从末尾插入,但相对于自定义类型排序还是不能有效解决问题。

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。

Examples

 using System;
using System.Collections.Generic;
using System.Linq; namespace Examples.Utils
{
public static class CollectionUtils
{
public static IList<T> MergeSortedLists<T>(Comparison<T> comparision, IList<T> list1, IList<T> list2)
{
var mergedList = new List<T>(list1.Count + list2.Count);
int i = , j = ;
while (i < list1.Count && j < list2.Count)
{
var result = comparision(list1[i], list2[j]);
if (result <= )
{
if (result == )
{
j++;
}
mergedList.Add(list1[i++]);
}
else
{
mergedList.Add(list2[j++]);
}
}
while (i < list1.Count)
{
mergedList.Add(list1[i++]);
}
while (j < list2.Count)
{
mergedList.Add(list2[j++]);
}
return mergedList;
}
}
}

TestExamples

 using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework; namespace Examples.Utils.Tests
{
[TestFixture]
public class CollectionUtilsTests
{
[Test]
public void Merge2TestNoDuplicate()
{
var list1 = new List<int> {, , , , };
var list2 = new List<int> {, , , , };
var mergedList = CollectionUtils.MergeSortedLists(IntegerComparision, list1, list2);
var expectedList = GetExpectedMergedList(IntegerComparision, list1, list2);
Assert.AreEqual(expectedList.Count, mergedList.Count);
CollectionAssert.AreEqual(expectedList, mergedList);
} [Test]
public void Merge2TestWithDuplicates()
{
var list1 = new List<int> {, , , , };
var list2 = new List<int> {, , , , };
var mergedList = CollectionUtils.MergeSortedLists(IntegerComparision, list1, list2);
var expectedList = GetExpectedMergedList(IntegerComparision, list1, list2);
Assert.AreEqual(expectedList.Count, mergedList.Count);
CollectionAssert.AreEqual(expectedList, mergedList);
} [Test]
public void Merge2TestNoOverlap1()
{
var list1 = new List<int> {, , , , };
var list2 = new List<int> {, , , , };
var mergedList = CollectionUtils.MergeSortedLists(IntegerComparision, list1, list2);
var expectedList = GetExpectedMergedList(IntegerComparision, list1, list2);
Assert.AreEqual(expectedList.Count, mergedList.Count);
CollectionAssert.AreEqual(expectedList, mergedList);
} [Test]
public void Merge2TestNoOverlap2()
{
var list1 = new List<int> {, , , , };
var list2 = new List<int> {, , , , };
var mergedList = CollectionUtils.MergeSortedLists(IntegerComparision, list1, list2);
var expectedList = GetExpectedMergedList(IntegerComparision, list1, list2);
Assert.AreEqual(expectedList.Count, mergedList.Count);
CollectionAssert.AreEqual(expectedList, mergedList);
} private static IList<T> GetExpectedMergedList<T>(Comparison<T> comparision, params IList<T>[] lists)
{
var set = new SortedSet<T>(new ComparisionComparer<T>(comparision));
foreach (var list in lists)
{
foreach (var item in list)
{
if (!set.Contains(item))
{
set.Add(item);
}
}
}
return set.ToList();
} private static int IntegerComparision(int x, int y)
{
return y - x;
} private class ComparisionComparer<T> : IComparer<T>
{
private readonly Comparison<T> _comparision; public ComparisionComparer(Comparison<T> comparision)
{
_comparision = comparision;
} public int Compare(T x, T y)
{
return _comparision(x, y);
}
}
}
}

C#两路list数组归并去重的更多相关文章

  1. list数组归并去重

    C#两路list数组归并去重 个相同类型已排序数据进行合并,虽然list数组中有AddRange方法,但它只是把第二个数组从第一个数组末尾插入,假如两个数组有重复数据,保存进去.还有Union方法合并 ...

  2. 对两个有序数组重新去重合并排序js实现

    这里主要是要利用两个数组有序这个条件,所以只需两个指针分别指向两个数组,当其中一个小于另外一个就移动该指针,反之则移动另外一个指针,如果相等则均向后移动. 结束条件是,当任意一个数组的指针移到末尾则跳 ...

  3. JS 两个对象数组合并并去重

    JS两个对象数组合并并去重 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. 合并两个数组并去重(ES5和ES6两种方式实现)

    合并两个数组并去重(ES5和ES6两种方式实现) ES6实现方式 let arr1 = [1, 1, 2, 3, 6, 9, 5, 5, 4] let arr2 = [1, 2, 5, 4, 9, 7 ...

  5. #leetcode刷题之路4-寻找两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 nums1 和 nums2 不会 ...

  6. leetcode 题解:Merge Sorted Array(两个已排序数组归并)

    题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...

  7. PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧

    PHP中两个数组合并可以使用+或者array_merge,但之间还是有区别的,而且这些区别如果了解不清楚项目中会要命的! 主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 ...

  8. STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数

    1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...

  9. 两个有序数组的中位数(第k大的数)

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路. ...

随机推荐

  1. 推荐JVM的9款编程语言杀手开发利器

    随着各种各样的编程语言铺地盖地向我们涌来,软件世界似乎变得有点疯狂了.JVM的帝国在不断地壮大,它已经不满足于只作为Java语言的运行平台.它勇敢地将自己的触角伸向了JRuby,Groovy等等,未来 ...

  2. (转)12款开源JavaScript库

    JavaScipt几乎是所有前端开发人员必会的编程语言,并且,随着各种移动APP的串红,JavaScript还可以用来开发移动应用.除此以外,为了丰富前端/移动开发,有不少开发者推出了各种基于Java ...

  3. JavaScript中的setAttribute用法

    我们经常需要在JavaScript中给Element动态添加各种属性,这可以通过使用setAttribute()来实现,这就涉及到了浏览器的兼容性问题. setAttribute(string nam ...

  4. oc结构

    结构 在oc中只能声明变量 不能声明函数和类 结构声明 struct DateT { int month; int day; int year; }; 结构可以在起最后的分号之后定义结构变量,并且可以 ...

  5. C/S ASP.NET页面传值汇总

    一. QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法.但是对于传递数组或对象的话,就不 ...

  6. zoj1074 To the Max

    题目很简单,求一个连续的最大子矩阵的值. zoj上的数据非常弱. 首先爆搜是O(N^4),10^8的复杂度略高,那么我们可以处理一下其中一维的前缀和,降一阶,然后按照连续最大子序列来处理,因为可能为负 ...

  7. elegant 的长整数加法 string 实现

    string strAdd(string &v1, string &v2){ string res = ""; ; int len1 = v1.size(), le ...

  8. Inno Setup打包的程序提升为管理员权限

    Inno Setup打包的程序在Win7 64位系统上安装,安装步骤最后一步若选中运行程序,会跳出一个错误提示框. 这是因为64位win7系统运行程序时需要管理员权限,而打包的文件并没有这个权限就试图 ...

  9. getHibernateTemplate().find()

    find(String queryString, Object[] values); 这个方法后者的参数必须是一个数组,而不能是一个List. List ul=getHibernateTemplate ...

  10. jQuery验证控件(转载)

    转自:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 官网地址:http://bassistance.de/jquery ...