经典的委托排序(深入分析)

对于数值型的排序我们都已经司空见惯了,但我们有时候希望我们的Sort()方法能够给任何对象排序,比如某段客户机代码包含Currency结构数组或其他的类和结构,就需要对该数组排序。这里我们使用委托并封装这个方法进行比较。

排序我们还是使用经典的冒泡排序,如果数据量较大你可以换为你自己的更高效的排序算法。

先给出整个代码:


代码如下:

public class BubbleSorter
{
 public static void Sort(object[] sortArray, CompareOperation gtMethod)
 {
  for (int i = 0; i < sortArray.Length; i++)
  {
   for (int j = 0; j < sortArray.Length; j++)
   {
    if (gtMethod(sortArray[j], sortArray[i]))
    {
     object tmp = sortArray[i];
     sortArray[i] = sortArray[j];
     sortArray[j] = tmp;
    }
   }
  }
 }
}
public class Employee
{
 private string name;
 private decimal salary;
 public Employee(string name, decimal salary)
 {
  this.name = name;
  this.salary = salary;
 }
 public override string ToString()
 {
  return string.Format(name.PadRight(20) + "{0:C}", salary);
 }
 public static bool RSalaryIsGreater(object lObj, object rObj)
 {
  Employee lEmployee = lObj as Employee;
  Employee rEmployee = rObj as Employee;
  return rEmployee.salary > lEmployee.salary;
 }
}

再给一个调用示例:


代码如下:

public delegate bool CompareOperation(object lObj, object rObj);
class Program
{
 static void Main(string[] args)
 {
  Employee[] employees =
  {
   new Employee("Tommy",20000),
   new Employee("Elmer",10000),
   new Employee("Daffy", 25000),
   new Employee("Wiley",1000000),
   new Employee("Foghorn",23000),
   new Employee("RoadRunner",50000),
  };
  CompareOperation employeeCompareOperation = new CompareOperation(Employee.RSalaryIsGreater);
  BubbleSorter.Sort(employees, employeeCompareOperation);
  for (int i = 0; i < employees.Length; i++)
  {
   Console.WriteLine(employees[i].ToString());
  }
 }
}

(0)

相关推荐

  • C#零基础学习理解委托

    说来惭愧,在大学的课程中,竟然没有听说过委托这个名称.那么今天我就带着大家一起探讨下委托和事件. 咱们先来看下委托 我主要从以下几个方面讲解 1,  为什么使用委托  2.什么是委托  3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法.与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的. 什么是委托? 委托是一种引用方法的类型,一旦为委

  • 深入c# Func委托的详解

    如下所示: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Anonymous_Lam{    delegate string ConvertMethod(string Method);    class Lambda_Fun    {        static void Main()        {            Conver

  • C#委托初级使用的实例代码

    复制代码 代码如下: delegate double ProcessDelegate(double param1, double param2); static double Muliply(double param1, double param2)        {            return param1 * param2;                } static double Divide(double param1, double param2)        {    

  • 对c#中委托的理解

    理解委托从一个简单的例子开始 金城武演的有部老电影叫<薰衣草>,里面有个情节大概是这样的:小金收客户的钱,然后代表客户去向不同的人Say I love you. 一开始他的客户都是中国人,只需要说中文,如下代码示例,很简单,支持所有中国客户: 复制代码 代码如下: public class LoveManager{    public void Love(string name)    {        Console.WriteLine("我爱你, {0}", name)

  • 深入委托与多播委托的详解

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{    class 简单的委托实例    {        public static double Area(double Val)        {            return Val * 2;        }        public static double Scar

  • 深入理解C#中常见的委托

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的.关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微.我就不用多废话了.今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景.Func,Action,Predicate全面解析首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: 复制代码 代码如下: (1) *delegate TRes

  • 基于C#委托的深入分析

    1.委托的定义 委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法. 委托简单的示例: 复制代码 代码如下: namespace DelegateDemo {     class Program     {         public delegate int MathOptDelegate(int value1,int value2);         public int add(int value1, int value2)         {            

  • 解析.Net 4.0 中委托delegate的使用详解

    .Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果.但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针:而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法的委托.一. 先来看下委托的定义:如下C#代码定义委托public delegate void DoSomething(int times);委托的定

  • 经典的委托排序(深入分析)

    对于数值型的排序我们都已经司空见惯了,但我们有时候希望我们的Sort()方法能够给任何对象排序,比如某段客户机代码包含Currency结构数组或其他的类和结构,就需要对该数组排序.这里我们使用委托并封装这个方法进行比较. 排序我们还是使用经典的冒泡排序,如果数据量较大你可以换为你自己的更高效的排序算法. 先给出整个代码: 复制代码 代码如下: public class BubbleSorter{ public static void Sort(object[] sortArray, Compar

  • JavaScript实现经典排序算法之冒泡排序

    冒泡排序可谓是最经典的排序算法了,它是基于比较的排序算法,时间复杂度为O(n^2),其优点是实现简单,n较小时性能较好. 1)算法原理        相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟下来,最小的数就被排在了第一位,第二趟也是如此,如此类推,直到所有的数据排序完成. 2)算法描述        <1>比较相邻的元素.如果第一个比第二个大,就交换它们两个:        <2>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会

  • Java多种经典排序算法(含动态图)

    算法分析 一个排序算法的好坏,一般是通过下面几个关键信息来分析的,下面先介绍一下这几个关键信息,然后再将常见的排序算法的这些关键信息统计出来. 名词介绍 时间复杂度:指对数据操作的次数(或是简单的理解为某段代码的执行次数).举例:O(1):常数时间复杂度:O(log n):对数时间复杂度:O(n):线性时间复杂度. 空间复杂度:某段代码每次执行时需要开辟的内存大小. 内部排序:不依赖外部的空间,直接在数据内部进行排序: 外部排序:数据的排序,不能通过内部空间来完成,需要依赖外部空间. 稳定排序:

  • Python实现各种排序算法的代码示例总结

    在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了一下排序算法,并用Python实现了各种排序算法,放在这里作为参考. 最简单的排序有三种:插入排序,选择排序和冒泡排序.这三种排序比较简单,它们的平均时间复杂度均为O(n^2),在这里对原理就不加赘述了.贴出来源代码. 插入排序: def insertion_sort(sort_lis

  • Trie树_字典树(字符串排序)简介及实现

    1.综述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie树结构的优点在于:1) 不限制子节点的数量: 2) 自定义的输入序列化,突破了具体语言.应用的限制,成为一个通用的框架: 3) 可以进行最大Tokens序列长度的限制:4) 根据已定阈值输出重复的字符串:5) 提

  • java交换排序之鸡尾酒排序实现方法

    本文实例讲述了java交换排序之鸡尾酒排序实现方法.分享给大家供大家参考.具体如下: 鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 与冒泡排序不同的地方: 鸡尾酒排序等于是冒泡排序的轻微变形.不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能,原因是冒

  • JavaScript中几种排序算法的简单实现

    排序算法的实现 我的JS水平就是渣渣,所以我就用类似于JAVA和C的方式来写JavaScript的排序算法了. 而且这里我不讲算法原理,仅仅只是代码实现,可能会有Bug,欢迎大家博客评论指导. 插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已

  • Java中常用的6种排序算法详细分解

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i-n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换.因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序.举个实例来看看: 初始: [38, 17, 16, 16, 7, 31, 39,

  • python数据结构的排序算法

    目录 十大经典的排序算法 一.交换排序 1.冒泡排序(前后比较-交换) 2.快速排序(选取一个基准值,小数在左大数在右) 二.插入排序 1.简单插入排序(逐个插入到前面的有序数中) 2.希尔排序(从大范围到小范围进行比较-交换) 三.选择排序 1.简单选择排序(选择最小的数据放在前面) 2.堆排序(利用最大堆和最小堆的特性) 四.归并排序 五.其他排序 1.计数排序(字典计数-还原) 2.桶排序(链表) 3.基数排序 十大经典的排序算法 数据结构中的十大经典算法:冒泡排序.快速排序.简单插入排序

  • Java常用的八种排序算法及代码实现+图解

    目录 1.冒泡排序 冒泡排序法的思路 2.冒泡排序法的代码实现 3.冒泡排序法优化 4.选择排序 5.插入排序 插入排序的思路 经典的排序算法有八种,分别为: 冒泡排序 选择排序 插入排序 归并排序 希尔排序 快速排序 堆排序 基数排序 其中冒泡排序.选择排序.插入排序称为三大基本排序. 虽然这三大基本排序算法时间复杂度都是O(n2),但是其实细细讨论之下,还是有各自的特点的. 1.冒泡排序 冒泡排序法的思路 基本思路: 假设我们需要进行升序排列 进行N轮的比较,每一轮将相邻的两个元素依次比较,

随机推荐