C#框架里面主要提供了两种排序方式:Array.Sort Linq.Orderby。
List.Sort排序简介
有许多猿猴对Sort原理进行了剖析,Sort排序实际上分为两部分,基于ClR内部排序,基于算法:深度限制快速排序(DepthLimitQuickSort)。基于CLR排序是针对内置类型排序;深度限制快速排序是先快速排序,达到一定深度时,更改为堆排序。核心代码如下:
private void DepthLimitedQuickSort(int left, int right, int depthLimit)
{
do
{
if (depthLimit == )
{
try
{
this.Heapsort(left, right);
break;
}
catch (IndexOutOfRangeException)
{
throw new ArgumentException(Environment.GetResourceString("Arg_BogusIComparer",
new object[] { this.comparer }));
}
catch (Exception innerException)
{
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), innerException);
}
}
int num = left;
int num2 = right;
int median = Array.GetMedian(num, num2);
try
{
this.SwapIfGreaterWithItems(num, median);
this.SwapIfGreaterWithItems(num, num2);
this.SwapIfGreaterWithItems(median, num2);
}
catch (Exception innerException2)
{
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), innerException2);
}
object obj = this.keys[median];
do
{
try
{
while (this.comparer.Compare(this.keys[num], obj) < )
{
num++;
}
while (this.comparer.Compare(obj, this.keys[num2]) < )
{
num2--;
}
}
catch (IndexOutOfRangeException)
{
throw new ArgumentException(Environment.GetResourceString("Arg_BogusIComparer",
new object[] { this.comparer }));
}
catch (Exception innerException3)
{
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), innerException3);
}
if (num > num2)
{
break;
}
if (num < num2)
{
object obj2 = this.keys[num];
this.keys[num] = this.keys[num2];
this.keys[num2] = obj2;
if (this.items != null)
{
object obj3 = this.items[num];
this.items[num] = this.items[num2];
this.items[num2] = obj3;
}
}
num++; num2--;
}
while (num <= num2);
depthLimit--;
if (num2 - left <= right - num)
{
if (left < num2)
{
this.DepthLimitedQuickSort(left, num2, depthLimit);
}
left = num;
}
else
{
if (num < right)
{
this.DepthLimitedQuickSort(num, right, depthLimit);
}
right = num2;
}
} while (left < right);
}
说明:
  1 使用Sort排序时,有可能会打破数组列表的基本顺序。在数据相同的项具有不同含义时,不能使用Sort排序。
   Array.Sort和List.Sort采用的是同一个排序方法。
 
Linq.Orderby排序简介
Orderby使用的快速排序,它不会破坏数组列表的基本顺序。排序核心代码如下:
internal int[] Sort(TElement[] elements, int count)
{
this.ComputeKeys(elements, count);
int[] map = new int[count];
for (int index = ; index < count; ++index)
map[index] = index;
this.QuickSort(map, , count - ); return map;
} private void QuickSort(int[] map, int left, int right)
{
do
{
int left1 = left;
int right1 = right;
int index1 = map[left1 + (right1 - left1 >> )];
while (true)
{
do
{
if (left1 >= map.Length || this.CompareKeys(index1, map[left1]) <= )
{
while (right1 >= && this.CompareKeys(index1, map[right1]) < )
--right1;
if (left1 <= right1)
{
if (left1 < right1)
{
int num = map[left1]; map[left1] = map[right1]; map[right1] = num;
}
++left1;
--right1;
}
else break;
}
else goto label_1;
} while (left1 <= right1); break;
label_1: ++left1;
}
if (right1 - left <= right - left1)
{
if (left < right1)
this.QuickSort(map, left, right1);
left = left1;
} else {
if (left1 < right)
this.QuickSort(map, left1, right);
right = right1;
}
} while (left < right);
}
说明:
1 一般情况下,业务相关的排序过程是不存在相同情况的。所以这个排序陷阱可以忽略
2 如果需要多个阶段的排序实现最终逻辑,且存在排序的位置相同情况时,不建议使用Array.Sort

排序陷阱 List.Sort Linq.OrderBy的更多相关文章

  1. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...

  2. Hibernate的集合映射与sort、order-by属性

    [Hibernate]Hibernate的集合映射与sort.order-by属性 常用集合Set.List.Map,相信大家都很熟悉,面试中也会经常问.Set和List都继承了Collection接 ...

  3. 排序合并连接(sort merge join)的原理

    排序合并连接(sort merge join)的原理 排序合并连接(sort merge join)的原理     排序合并连接(sort merge join)       访问次数:两张表都只会访 ...

  4. [大牛翻译系列]Hadoop(5)MapReduce 排序:次排序(Secondary sort)

    4.2 排序(SORT) 在MapReduce中,排序的目的有两个: MapReduce可以通过排序将Map输出的键分组.然后每组键调用一次reduce. 在某些需要排序的特定场景中,用户可以将作业( ...

  5. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

  6. 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。

    namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...

  7. 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort

    选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...

  8. 6种字符串数组的java排序 (String array sort)

    注意,本文不是字符串排序,是字符串数组的排序. 方法分别是: 1.低位优先键索引排序 2.高位优先建索引排序 3.Java自带排序(经过调优的归并排序) 4.冒泡排序 5.快速排序 6.三向快速排序 ...

  9. Python排序算法——希尔排序(Shell’s Sort)

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...

随机推荐

  1. drawing

    /* 程序名:drawing..c 功能:展示OpenCV的图像绘制功能 */ #include "cv.h" #include "highgui.h" #in ...

  2. 其原因可能是堆被损坏,这说明**.exe中或它加载的任何DLL中有Bug

    最近在写一个写日志文件的线程时,调用了HeapAlloc/HeapFree 申请/释放堆缓冲内存.调用HeapFree释放有个条件就是,日志的空闲缓冲队列中内存块超过100个.在测试的时候,发现调用H ...

  3. 关于mysql数据库字符集优先级问题

    mysql数据库可以分别设置数据库字符集.表字符集和表字段字符集. 1.数据库字符集 < 表字符集 < 表字段(列)字符集. 例如数据库字符集为gbk -- GBK Simplified ...

  4. Myeclispe 安装 SVN :

    Myeclispe 安装 SVN :解压 : site-1.8.22.zip  放入如下路径下即可 :

  5. C# string.Split对于换行符的分隔正确用法

    C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...

  6. SQL事务

    一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小的 ...

  7. openfire 连接sqlserver 2008 的一个问题

    由于本人的笨拙,搞了一天才终于搞好,说实在的问题归根结底还是在sql上,要相信openfire是没问题的.好了,不瞎扯了,说正题. 本人的机器环境为:win7.sqlserver 2008.jdk1. ...

  8. 【NoSql】Redis

    [NoSql]Redis 一. 文档 1. 官网 2. Windows 安装包 3. C# Driver a. ServiceStack.Redis 最新版本是收费的 b. StackExchange ...

  9. Expected one result (or null) to be returned by selectOne(), but found 2

    这个问题在于你查询sql返回结果是多个值.一个集合,但是你在service的实现层的dao都调用了.get方法.而是应该使用.getlist方法等.

  10. openvpn安装

    1,wget http://swupdate.openvpn.org/as/openvpn-as-2.0.10-CentOS7.x86_64.rpm 2,passwd openvpn