冒泡排序算法是我们经常见到的尤其是子一些笔试题中.

下面和大家讨论c#中的冒泡排序,笔者提供了三种解决方案,并且会分析各自的性能优劣.

第一种估计大家都掌握的,使用数据交换来实现,这种就不多说了,园子里的各位前辈分析的都很好,搜一下就有很多.

简单贴一下代码:

  //定义数组
static int[] nums = new int[] { , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , };
static void Main(string[] args)
{
Console.WriteLine("冒泡排序之传统方法");
BubblingOne();
Console.ReadKey();
}
/// <summary>
/// 冒泡排序,传统数据交换实现
/// </summary>
static void BubblingOne()
{
//定义一个需要排序的数组 //定义一个临时变量用于数据交换
int temp; //临时变量,保存最大值
int i, j; //循环变量
for (i = ; i < nums.Length - ; i++)
{
for (j = ; j < nums.Length - - i; j++)
{
if (nums[j] < nums[j + ])
{
temp = nums[j];
nums[j] = nums[j + ];
nums[j + ] = temp;
}
}
}
foreach (int c in nums) //用foreach输出排序后的数组元素
{
Console.Write(c + "\t");
}
}

运行结果如下:

接下来我们介绍第二种实现方法:Linq的查询表达式语法的实现.

关于Linq的介绍请参见:

   /// <summary>
/// linq 冒泡排序算法
/// </summary>
static void BubblingTwo()
{
IEnumerable<int> num = from a in nums orderby a descending select a;
foreach (int item in num)
{
Console.Write(item + "\t");
}
}

请注意我们实现了泛型接口IEnumerable<T>

IEnumerable<T> 是一个接口,通过该接口,可以使用 foreach 语句来枚举泛型集合类。 泛型集合类支持 IEnumerable<T>,就像非泛型集合类(如ArrayList)支持 IEnumerable

运行结果和第一种方法一致.

你可能已经发现了,代码简洁了许多,有原来的8行缩短为一行,这不正是我们的追求吗?尤其是在面试的时候是否为你节约了大量的时间?

那是否还有其他的方式继续实现冒泡排序呢?答案是肯定的,记住我们是对数组中的数据进行操作,Linq有两个扩展方法OrderByDescending和OrderBy用于对数据排序,请参见:对数据进行排序

第三种实现:使用Linq 的扩展方法OrderByDescending(倒序排列)和OrderBy(正序排列)

  /// <summary>
/// 使用Linq的扩展方法OrderByDescending
/// </summary>
static void BubblingThree()
{
IEnumerable<int> num = nums.OrderByDescending(a => a);
foreach (int item in num)
{
Console.Write(item + "\t");
}
}

代码一如既往的简洁.请注意该方式实现了IEnumerable<T>接口.

也许还有更多的实现方式,但本文只介绍这三种方法.

既然有这么多实现方法,我们应该怎么选择用哪种呢,笔者在这里做了一个简单的性能对比(比较各自的执行时间).

首先我们更新以上代码,加入时间的计算:

在为三种方法加入了上图红色区域代码后,我们比较一下不同数据量三种方法各自的表现

插入5条数据

       //5条数据
static int[] nums = new int[] { , , , , };

结果如下:

从上图我们可以简单得出结论,在小数据量是Linq的查询表达式语法表现最差,使用OrderByDescending方法最佳.

下面我们多加几条数据.

  //15条数据
static int[] nums = new int[] { , , , , , , , , , , , , , , };

结果如下:

结果还是OrderByDescending方法领先

我们继续加入数据:

   //50条数据
static int[] nums = new int[] { , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , };

结果如下:

从上图中我们可以看到情况发生了变化,第一种方法领先,然而在我们的测试中丝毫没有看到Linq查询表达式语法(感谢@WAKU的批评)的优势,但对于Linq中的扩展方法OrderByDescing()却有不俗的表现;

以上介绍了在C#下的三种冒泡排序方法以及性能分析.由于数据量较小得出结论难免没有说服力,有兴趣的朋友可已多加数据至数万条。

如果对你有帮助,请帮忙推荐一下.

c#之冒泡排序的三种实现和性能分析的更多相关文章

  1. 三种工厂模式的分析以及C++实现

    三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...

  2. Mysql Binlog三种格式介绍及分析【转】

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  3. C2B电商三种主要模式的分析_数据分析师

    C2B电商三种主要模式的分析_数据分析师 在过去的一年中电商领域血雨腥风,尤其是天猫.京东.苏宁.当当.易讯等B2C电商打得不亦乐乎.而随着B2C领域竞争进入白热化阶段,C2B模式也在天猫" ...

  4. C#实例化对象的三种方式及性能对比

    前言 做项目过程中有个需求要实例化两万个对象并添加到List中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例化 ...

  5. Day008 三种初始化及内存分析

    三种初始化和内存分析 Java内存分析: 堆: 存放new的对象和数组. 可以被所有的线程共享,不会存放别的对象引用. 栈: 存放基本变量类型(会包含这个基本类型的具体数值). 引用对象的变量(会存放 ...

  6. Windows五种IO模型性能分析和Linux五种IO模型性能分析

    Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...

  7. 冒泡排序的三种实现(Java)

    冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后. 设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换. (2)这样 ...

  8. Mysql Binlog 三种格式介绍及分析

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  9. java list三种遍历方法性能比较

    从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...

随机推荐

  1. Android4.4 蓝牙源代码段分析

    最近GOOGLE发布时间Android4.4,我看了看源代码.4.4蓝牙打开过程或这部分的一些变化,判断蓝牙开关是从接口设置settings在里面switch开关,widget当然,它可以切换,也许启 ...

  2. (大数据工程师学习路径)第三步 Git Community Book----高级技能

    一.创建新的空分支 1.创建新的空分支 在偶尔的情况下,你可能会想要保留那些与你的代码没有共同祖先的分支.例如在这些分支上保留生成的文档或者其他一些东西.如果你需要创建一个不使用当前代码库作为父提交的 ...

  3. (两)unity4.6Ugui中国教程文档-------总结-UGUI Canvas

    大家好,我是广东太阳.   转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unitym ...

  4. HTTPS背后的加密算法(转)

    当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一 ...

  5. 怪异php 语法, 求解!

    查找php馍用来推断是否串串返回值和方法 strpos很奇怪. 请看下面的语句: echo "A1: ".(strpos("csd","c" ...

  6. SD3.0四个协议解读

    前面的文章提到过SD卡主要分为两个操作模式,一是初始化和识别操作模式.还有一种就是这篇文章须要分析的传输数据模式啦. 传输数据模式: 传输数据模式主要有六种状态,各自是Stand-by状态.Trans ...

  7. 运用TWaver 3D 矢量图形处理能力

    的确,提起TWaver,大家想到的首先是"电信拓扑图组件".事实上.因为其灵活的MVC架构.矢量化设计.方便定制等特点.TWaver能够做的还有非常多.比如房地产行业常见到的&qu ...

  8. 房间计费系统改造E-R图纸设计

    简单的学习过程:     这几天忙得太混乱了,用了近一个星期才设计好.我在这段时间遇到的困难,就积极找师哥师姐指点迷津,如今多少总算是有些拿得出手的成果. 学习成果: Entity Relations ...

  9. iOS开发之protocol和delegate

     protocol--协议 协议是用来定义对象的属性,行为和用于回调的.     协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...

  10. [Phonegap+Sencha Touch] 移动开发34 gem安装compass,不编译scss,怎么办?

    很多人已经发现,今天,该命令 "gem install compass" 安装compass,正在使用 "compass compile" 编scss的时间将报 ...