1.介绍

冒泡排序的基本思想就是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底的气泡一样逐渐向上冒泡。

因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下
来没有进行过交换,就说明序列有序,因此要在排序过程中设置
一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

时间复杂度:O(n^2)  

2.图解

3.代码实现

  1. using System;
  2.  
  3. namespace DataStructure
  4. {
  5. public class BubbleSort
  6. {
  7. /// <summary>
  8. /// 测试
  9. /// </summary>
  10. public static void Test()
  11. {
  12. int[] arr = { , , -, , };
  13.  
  14. Console.WriteLine("排序的数组:" + ArrayToString(arr));
  15.  
  16. Console.WriteLine("\n优化后的数组排序");
  17.  
  18. Sort(arr);
  19.  
  20. Console.WriteLine("\n优化前的数组排序");
  21.  
  22. arr = new int[] { , , -, , };
  23.  
  24. for (int i = ; i < arr.Length - - ; i++)
  25. {
  26. int temp = ;
  27.  
  28. if (arr[i] > arr[i + ])
  29. {
  30. temp = arr[i];
  31.  
  32. arr[i] = arr[i + ];
  33.  
  34. arr[i + ] = temp;
  35. }
  36. }
  37.  
  38. System.Console.WriteLine("\n第一次排序的结果:" + ArrayToString(arr));
  39.  
  40. for (int i = ; i < arr.Length - - ; i++)
  41. {
  42. int temp = ;
  43.  
  44. if (arr[i] > arr[i + ])
  45. {
  46. temp = arr[i];
  47.  
  48. arr[i] = arr[i + ];
  49.  
  50. arr[i + ] = temp;
  51. }
  52. }
  53. System.Console.WriteLine("\n第二次排序的结果:" + ArrayToString(arr));
  54.  
  55. for (int i = ; i < arr.Length - - ; i++)
  56. {
  57. int temp = ;
  58.  
  59. if (arr[i] > arr[i + ])
  60. {
  61. temp = arr[i];
  62.  
  63. arr[i] = arr[i + ];
  64.  
  65. arr[i + ] = temp;
  66. }
  67. }
  68. System.Console.WriteLine("\n第三次排序的结果:" + ArrayToString(arr));
  69.  
  70. for (int i = ; i < arr.Length - - ; i++)
  71. {
  72. int temp = ;
  73.  
  74. if (arr[i] > arr[i + ])
  75. {
  76. temp = arr[i];
  77.  
  78. arr[i] = arr[i + ];
  79.  
  80. arr[i + ] = temp;
  81. }
  82. }
  83. System.Console.WriteLine("\n第四次排序的结果:" + ArrayToString(arr));
  84. }
  85.  
  86. /// <summary>
  87. /// 将数组转换成String
  88. /// </summary>
  89. /// <param name="arr"></param>
  90. /// <returns></returns>
  91. public static string ArrayToString(int[] arr)
  92. {
  93.  
  94. string result = "";
  95.  
  96. for (int i = ; i < arr.Length; i++)
  97. {
  98. result += arr[i] + ",";
  99. }
  100.  
  101. return result;
  102. }
  103. /// <summary>
  104. /// 排序算法优化并封装
  105. /// </summary>
  106. /// <param name="arr"></param>
  107. public static void Sort(int[] arr)
  108. {
  109. //标识标量,表示是否被交换过
  110. bool flag = false;
  111.  
  112. //临时变量
  113. int temp = ;
  114.  
  115. //要排序的次数,arr.Length-1
  116. for (int i = ; i < arr.Length; i++)
  117. {
  118. //第几次排序
  119. for (int j = ; j < arr.Length - i; j++)
  120. {
  121. //如果前面的数大于后面的数,则交换
  122. if (arr[j] > arr[j + ])
  123. {
  124. flag = true;
  125.  
  126. temp = arr[j];
  127.  
  128. arr[j] = arr[j + ];
  129.  
  130. arr[j + ] = temp;
  131. }
  132. }
  133. //每次排序的结果
  134. System.Console.WriteLine("\n第" + i + "次排序的结果:" + ArrayToString(arr));
  135.  
  136. if (!flag) break; //在一趟排序中,一次交换都没有发生过
  137.  
  138. else flag = false; //重置flag进行下次判断
  139.  
  140. }
  141. }
  142. }
  143. }

4.结果图

C#数据结构与算法系列(十八):冒泡排序算法(BubbleSort)的更多相关文章

  1. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十八】

    <Web 前端开发精华文章推荐>2013年第六期(总第十八期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  2. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》

    大家好,我是咔咔 不期速成,日拱一卒 之前ElasticSearch系列文章中提到了如何处理空值,若为Null则会直接报错,因为在ElasticSearch中当字段值为null时.空数组.null值数 ...

  4. 数据结构与算法系列----最小生成树(Prim算法&amp;Kruskal算法)

     一:Prim算法       1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...

  5. 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...

  6. C#数据结构与算法系列(八):栈(Stack)

    1.介绍 栈是一个先入后出(FILO-First In Last Out)的有序列表 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表.允许插入和删除的一端,为变化的一端,称为栈顶 ...

  7. BizTalk开发系列(十八) 使用信封拆分数据库消息

    之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Se ...

  8. SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。

    本文是在学习https://blog.csdn.net/housisong/article/details/1452249一文的基础上对算法的理解和重新整理,再次非常感谢原文作者的深入分析以及分享. ...

  9. WPF入门教程系列十八——WPF中的数据绑定(四)

    六.排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider.CollectionViewSource 则会 ...

  10. Storm系列(十八)事务介绍

    功能:将多个tuple组合成为一个批次,并保障每个批次的tuple被且仅被处理一次. storm事务处理中,把一个批次的tuple的处理分为两个阶段processing和commit阶段. proce ...

随机推荐

  1. Golang基础教程——map使用篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第7篇文章,我们来聊聊golang当中map的用法. map这个数据结构我们经常使用,存储的是key-value的键 ...

  2. Java实现 蓝桥杯 算法提高 三角形

    算法提高 12-1三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长.面积. ...

  3. Java实现 LeetCode 229 求众数 II(二)

    229. 求众数 II 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2, ...

  4. SQL Server实现 LeetCode 177 第N高的薪水

    177. 第N高的薪水 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary). +----+--------+ | Id | Salary | +----+------ ...

  5. 第七届蓝桥杯JavaB组国(决)赛部分真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.愤怒小鸟 题目描述 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距 1000 米 两火车 (不妨称A和B) 以时速 10米 ...

  6. java实现第六届蓝桥杯奇怪的数列

    奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 - YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行& ...

  7. Java实现第八届蓝桥杯分巧克力

    分巧克力 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...

  8. JNI_day01

    C语言简介 system()是提供C语言调用系统命令的函数 C语言基本数据类型 C语言中的整数类型:char/short/int/long C中使用ASCII保存字符,所以char所占用的字节数为1 ...

  9. 根据现有Bitmap生成相同图案指定大小的新Bitmap

    通过一张现有的Bitmap,画出一张同样的但是大小使我们指定的Bitmap 需求:直接createBitmap的话不允许生成的bitmap的宽高大于原始的,因此需要特定方法来将一张Bitmap的大小进 ...

  10. Centos 7 k8s Deployment新副本控制器

    一.概念 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment.通过在Deployment中描述你所期望的集群状态,Deployment Controller会将在 ...