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

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

具体算法描述如下:

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. DevExpress v18.1新版亮点——DevExtreme篇(四)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExtreme JavaScript Controls v18.1 的新功能 ...

  2. [PyImageSearch] Ubuntu16.04下针对OCR安装Tesseract

    今天的博文是安装和使用光学字符识别(OCR)的Tesseract库的两部分系列的第一部分. 本系列的第一部分将着重于在您的机器上安装和配置Tesseract,然后使用tesseract命令将OCR应用 ...

  3. L327 找灵魂伴侣

    Looking for the Perfect Partner I'm sure we all remember a time when we fell in love. For some it wa ...

  4. Arduino 串口输出LM35温度

    #include "stdlib.h" float temp = 0.0; float maxtemp = 0.0; float mintemp =100.0; // the se ...

  5. suse 12 sp1 系统添加zabbix agent监控

    因为之前走入一个误区,认为linux系统的zabbix安装包都是一样的,其实不同的linux的系统对应的版本是不一样的. suse系统版本(不同版本之间也是有区别的):SUSE Linux  12 S ...

  6. 2019-03-15-day011-递归生成器

    函数的进阶: 动态参数: 两种: 动态位置参数 > 动态默认参数 打散(聚合): 实参处打散 形参处聚合 不在函数中第一次使用*打散,第二次是聚合 在数据库中快速写入数据的时候,**dic 名称 ...

  7. (Object String 类中的方法练习)

    package com.zs.demo1; public class Demo1 { public static void main(String[] args) { fun1(); fun2(); ...

  8. SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)

    1.pom.xml增加依赖包 <dependency> <groupId>io.springfox</groupId> <artifactId>spri ...

  9. 1--Jmeter4.0连接Oracle数据库

    一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...

  10. python2.6.6 升级 2.7.X

    下载包 解压 cd 进入 ./configure && make all && make install && make clean && ...