C# 集合扩展快速排序算法
/// <summary>
/// 对集合进行排序,如
/// List<Person> users=new List<Person>(){.......}
/// ListSorter.SortList<list<Person>,Person>( users,"Age",SortDirection.Ascending);
/// </summary>
public static class ListUtil
{
public static void SortList<TCollection, TItem>(this TCollection list, string property, SortDirection direction) where TCollection : IList<TItem>
{
PropertyInfo[] propertyinfos = typeof(TItem).GetProperties();
foreach (PropertyInfo propertyinfo in propertyinfos)
{
if (propertyinfo.Name == property) //取得指定的排序属性
{
QuickSort<TCollection, TItem>(list, , list.Count - , propertyinfo, direction);
}
}
}
/// <summary>
/// 快速排序算法
/// </summary>
/// <typeparam name="TCollection">集合类型,需要实现Ilist<T>集合</typeparam>
/// <typeparam name="TItem">集合中对象的类型</typeparam>
/// <param name="list">集合对象</param>
/// <param name="left">起始位置,从0开始</param>
/// <param name="right">终止位置</param>
/// <param name="propertyinfo">集合中对象的属性,属性必须要实现IComparable接口</param>
/// <param name="direction">排序类型(升序或降序)</param>
private static void QuickSort<TCollection, TItem>(TCollection list, int left, int right, PropertyInfo propertyinfo, SortDirection direction) where TCollection : IList<TItem>
{
if (left < right)
{
int i = left, j = right;
TItem key = list[left];
while (i < j)
{
if (direction == SortDirection.Ascending)
{
while (i < j && ((IComparable)propertyinfo.GetValue(key, null)).CompareTo((IComparable)propertyinfo.GetValue(list[j], null)) < )
{
j--;
}
if (i < j)
{
list[i] = list[j];
i++;
} while (i < j && ((IComparable)propertyinfo.GetValue(key, null)).CompareTo((IComparable)propertyinfo.GetValue(list[i], null)) > )
{
i++;
}
if (i < j)
{
list[j] = list[i];
j--;
}
list[i] = key;
}
else
{
while (i < j && ((IComparable)propertyinfo.GetValue(key, null)).CompareTo((IComparable)propertyinfo.GetValue(list[j], null)) > )
{
j--;
}
if (i < j)
{
list[i] = list[j];
i++;
} while (i < j && ((IComparable)propertyinfo.GetValue(key, null)).CompareTo((IComparable)propertyinfo.GetValue(list[i], null)) < )
{
i++;
}
if (i < j)
{
list[j] = list[i];
j--;
}
list[i] = key;
}
}
//执行递归调用
QuickSort<TCollection, TItem>(list, left, i - , propertyinfo, direction);
QuickSort<TCollection, TItem>(list, i + , right, propertyinfo, direction);
}
}
}
/// <summary>
/// 排序类型
/// </summary>
public enum SortDirection
{
Ascending,
Descending
}
static void SortList<TCollection, TItem>(params...)
static void QuickSort<TCollection, TItem>(params...)
两个函数摘自http://www.cnblogs.com/sosoft博客,我直接将算法扩展给了List<T>类
测试:
static void Main(){
Console.WriteLine("\r\n=======List<T>快速排序========");
List<Person> list2 = new List<Person>()
{
new Person { Name = "", Age = },
new Person { Name = "", Age = },
new Person { Name = "", Age = },
new Person { Name = "", Age = },
new Person { Name = "-1", Age = - },
new Person { Name = "-2", Age = - },
new Person { Name = "", Age = },
};
list2.SortList<List<Person>, Person>("Age", SortDirection.Descending);
foreach (var temp in list2)
{
Console.Write(temp.Name + " ");
}
Console.ReadLine();
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
C# 集合扩展快速排序算法的更多相关文章
- js快速排序算法解析
数组的快速排序算法,和并归排序步骤基本类似. 都是先拆分,后合并.并归排序是:拆分容易,合并难. 快速排序是:拆分难,合并容易 要理解快速排序,首先要理解拆分逻辑 要素:找一个基准点,通过操作使得数列 ...
- 快速排序算法(Quicksort)
快速排序算法是对集合中元素进行排序最通用的算法,俗称快排,其算法的时间复杂度为O(nlgn),空间复杂度为O(1). 我们举例来对其算法思路进行理解,譬如数组 A = { 4, 8, 1, 2, 9, ...
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
- poj1061-青蛙的约会(扩展欧几里德算法)
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...
随机推荐
- scrapy 爬取 useragent
useragentstring.com 网站几乎廊括了所有的User-Agent,刚学了scrapy,打算那它练手,把上面的 user-agent 爬取下来. 本文只爬取常见的 FireFox, Ch ...
- 流程引擎Activiti系列:如何将kft-activiti-demo-no-maven改用mysql数据库
kft-activiti-demo-no-maven这个工程默认使用h2数据库,这是一个内存数据库,每次启动之后都要重新对数据库做初始化,很麻烦,所以决定改用mysql,主要做3件事情: 1)在mys ...
- mysql5.7.12直接解压zip包,安装过程
MySQL-5.7.12-winx64.zip解压安装方式 1.解压文件到你想要安装的位置. 本人是直接解压到E盘. 2.配置环境变量,在path中放入:E:\mysql-5.7.12-win ...
- 通俗易懂------this指向
因为JavaScript 中this 是在运行期进行绑定的,因此JavaScript 中this 关键字具备多重含义. 具体在实际应用中,this的指向大致可以分为下面4种. 作为对象的方法调用 ...
- EF实体框架之CodeFirst八
前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题. 一.数据准备 还是在前面的demo上修改,这次使用Province和City类. publ ...
- QRadioButton分组且无边框的简单实现
最近在用QT+VS2008做一个项目,涉及到一个综合测评表,说白了有点像问卷调查——很多题目每题若干个选项. 初始时打算用下拉框,每个框中填入所有选项,但后来一琢磨这种方式不够直观与人性化,增添了一步 ...
- tsql的奇特语法
也许是离开t-sql太久了,突然发现很多t-sql的奇特语法 用一句sql解决多种排序: ; SELECT C1, C2 FROM T ORDER BY THEN C1 END ASC, THEN C ...
- offsetWidth与scrollLeft
有两个值一个是:scrollTop一个是scrollLeft第一个代表页面利用滚动条滚动到下方时,隐藏在滚动条上方的页面的高度:第二个代表页面利用滚动条滚动到右侧时,隐藏在滚动条左侧的页面的宽度 do ...
- 2016 版 Laravel 系列入门教程(四)【最适合中国人的 Laravel 教程】
本教程示例代码见: https://github.com/johnlui/Learn-Laravel-5 在任何地方卡住,最快的办法就是去看示例代码. 本篇文章中,我将跟大家一起实现 Article ...
- java核心数据结构总结
JDK提供了一组主要的数据结构的实现,如List.Set.Map等常用结构,这些结构都继承自java.util.collection接口. List接口 List有三种不同的实现,ArrayList和 ...