Bubble Sort冒泡排序
冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来.
下面这种图很清晰的解释了什么是冒泡算法.
具体算法描述如下:
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冒泡排序的更多相关文章
- Bubble Sort 冒泡排序
//Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...
- c++算法联系,冒泡排序,bubble sort,插入排序,insert sort,
#include <iostream.h> #define MAX 100 void dispaly(int a[],int n) { for(int i=0;i<n;i+ ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- 冒泡排序(Bubble Sort)
常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...
- [算法] 冒泡排序 Bubble Sort
冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- 排序算法 (sorting algorithm)之 冒泡排序(bubble sort)
http://www.algolist.net/Algorithms/ https://docs.oracle.com/javase/tutorial/collections/algorithms/ ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
随机推荐
- 8.3 C++格式标识和操纵器
参考:http://www.weixueyuan.net/view/6409.html 总结: 我们需要借助格式标识符来控制cout对象的输出格式. 在ios_base类中,系统已经定义了很多格式标识 ...
- js正则学习
一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. ...
- 用servlet实现用户登录案例
以下实现登录窗口 Login.jsp <!--Login.jsp--> <%@ page language="java" import="java.ut ...
- 关于Java课堂实验中的一些总结(Scanner)
import java.util.Scanner; 这个头文件是java里面用来输入东西的,就相当于c++里面的iostream输入流...?暂且这么理解吧 然后使用方法:Scanner in = n ...
- c/c++动态内存分配的区别
c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...
- Java基础-类和对象
类和对象 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. ...
- 从SharePoint 2013迁移到SharePoint Online - 评估工具
博客地址:http://blog.csdn.net/FoxDave 今天想跟大家分享一款从SharePoint 2013迁移到SharePoint Online时的评估工具:SharePoint ...
- LeetCode子集问题
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(子集当中不包括重复的元素) 代码如下: def subsets(nums): target=[[]] for num in nums ...
- $_SERVER['URI']
WordPress通过301重定向实现非首先域(非www)跳转向本来是一个很简单事情,由于没弄清楚$_SERVER['HTTP_X_REWRITE_URL'] 和$_SERVER['REQUEST_U ...
- socketserver 和 事件Event
socketserver 处理socket服务端 # 服务端TCP: import socketserver from threading import current_thread # fork l ...