冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来.

下面这种图很清晰的解释了什么是冒泡算法.

具体算法描述如下:

1. 比较相邻的元素. 如果第一个比第二个大, 就交换他们两个.

2. 对每一对相邻元素作同样的工作, 从开始第一队到结尾的最后一对, 这样在最后的元素应该会是最大的数.

3. 针对所有的元素重复以上的步骤, 除了最后一个.

4. 重复步骤1-3, 直到排序完成.

我们来实现以下bubble sort

// int[] intList = new int[] { 2, -2, 6, 4, 5, 3, 7, 8, 11, 14 };
private void BubbleSort1(int[] intList)
{
var watch = new Stopwatch();
watch.Start();
var count = ;
for (int i = ; i < intList.Length; i++)
{
for (int j = ; j < intList.Length - - i; j++)
{
if (intList[j] > intList[j + ]) // 相邻元素两两对比
{
var temp = intList[j + ]; // 元素交换
intList[j + ] = intList[j];
intList[j] = temp;
}
count++; // 计算次数
}
}
watch.Stop();
var printOut = string.Empty;
foreach (var item in intList)
{
printOut += " " + item;
}
Console.WriteLine($"Result 1: {printOut}");
Console.WriteLine($"Count time: {count}");
Console.WriteLine($"Response time {watch.Elapsed.TotalMilliseconds.ToString()}ms");
}

以上是最简单的算法.

让我们对bubble sort做个改动已达成最优.

这里我们整理一下思路.

当数组有些数字已经排序好 (e.g. 4,5,6,7), 我们遍历比较一次就没有必要再去比较.

因此, 在排序过程中, 我们可能会重复的去多次比较已经排好的序列, 这样就造成了冗余, 当数据量大时, 会明显的耗时.

为解决这个问题, 我们在这里加一个lastIndex索引, 用于标记最后一次交换的位置.

rivate void BubbleSort2(int[] intList)
{ var watch = new Stopwatch();
watch.Start();
int i = intList.Length - ;
int count = ; // 计数
while (i > )
{
int lastChange = ; // 记录最后一次交换位置
for (int j = ; j < i; j++)
{
// 前面比后面大,则进行交换
if (intList[j] > intList[j + ])
{
intList[j] = intList[j] + intList[j + ];
intList[j + ] = intList[j] - intList[j + ];
intList[j] = intList[j] - intList[j + ];
lastChange = j; // 每交换一次更新一次
}
count++;
}
i = lastChange;
}
watch.Stop();
var printOut = string.Empty;
foreach (var item in intList)
{
printOut += " " + item;
}
Console.WriteLine($"Result 1: {printOut}");
Console.WriteLine($"Count time: {count}");
Console.WriteLine($"Response time {watch.Elapsed.TotalMilliseconds.ToString()}ms");
}

Bubble Sort冒泡排序的更多相关文章

  1. Bubble Sort 冒泡排序

    //Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...

  2. c++算法联系,冒泡排序,bubble sort,插入排序,insert sort,

    #include <iostream.h> #define  MAX 100 void dispaly(int a[],int n) {     for(int i=0;i<n;i+ ...

  3. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  4. HDU 5775 Bubble Sort(冒泡排序)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  5. 冒泡排序(Bubble Sort)

    常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...

  6. [算法] 冒泡排序 Bubble Sort

    冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

  7. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  8. 排序算法 (sorting algorithm)之 冒泡排序(bubble sort)

    http://www.algolist.net/Algorithms/ https://docs.oracle.com/javase/tutorial/collections/algorithms/ ...

  9. 排序算法--冒泡排序(Bubble Sort)_C#程序实现

    排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...

随机推荐

  1. springmvc添加拦截器

    springmvc.xml配置如下: 除了 sysFile 下的所有接口,以及user下的loginUser接口,其他的所有接口都会经过拦截器UserInterceptor处理 <mvc:int ...

  2. tp配置

    <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE ...

  3. SQL-5查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工

    输出描述: 题目描述 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工CREATE TABLE `dept_emp` (`emp_ ...

  4. DevExpress WPF v18.2新版亮点(一)

    买 DevExpress Universal Subscription  免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第 ...

  5. SharePoint Framework 企业向导(二)

    博客地址:http://blog.csdn.net/FoxDave 开发者视角 SharePoint开发者,无论是新手还是有经验的,都可以从SPFx中获取一些东西.当前SPFx的发布版本专注于以一 ...

  6. Java语法基础学习DayNine(Java集合)

    一.Java集合 1.概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要对对象进行存储.另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器, ...

  7. Arduino-汉王PM2.5检测模组B1

    汉王PM2.5检测模组B1,接入Arduino,使用I2C1602显示屏显示 #include <Arduino.h> #include <Wire.h> #include & ...

  8. 关于“用VS2010的C++导入ADO导入不了,提示无法打开源文件msado15.tlh”的问题

    vc++2010中,要使用ado操作数据库,所以在stdafx.h中引入了ado的dll库,引入代码如下: #import "C:/Program Files/Common Files/Sy ...

  9. 解决 java.lang.ClassNotFoundException: javax.servlet.ServletContext报错

    原因:tomcat找不到servlet,即缺少了servlet-api.jar包 解决方法: 我的项目是用maven搭建的 在pom.xml中加入依赖 <dependency> <g ...

  10. android 8.0 intent安装apk失败屏幕闪过

    需要做两处设置: 1.android8.0要加一条权限: <uses-permission android:name="android.permission.REQUEST_INSTA ...