http://www.algolist.net/Algorithms/

https://docs.oracle.com/javase/tutorial/collections/algorithms/

https://en.wikipedia.org/wiki/Sorting_algorithm

冒泡排序(Bubble sort)

https://en.wikipedia.org/wiki/Bubble_sort

loop1:

4,6,1,3,7 -> 4,6,1,3,7

4,6,1,3,7 -> 4,1,6,3,7

4,1,6,3,7 -> 4,1,3,6,

4,1,3,6,7 -> 4,1,3,6,7

loop2:

4,1,3,6,7 -> 1,4,3,6,7

1,4,3,6,7 -> 1,3,4,6,7

1,3,4,6,7 -> 1,3,4,6,7

1,3,4,6,7 -> 1,3,4,6,7

loop3:

1,3,4,6,7 -> 1,3,4,6,7

1,3,4,6,7 -> 1,3,4,6,7

1,3,4,6,7 -> 1,3,4,6,7

                                                            1,3,4,6,7 -> 1,3,4,6,7

当第三次循环,没有发生swap 说明已排序完成 ,应 break

冒泡排序特点:

1)比较相邻的两个数

2)只能通过判断没有交换来提前结束

最好的情况:

loop1:

1,2,3 -> 1,2,3

1,2,3 -> 1,2,3

最坏的情况:

loop1:

3,2,1 -> 2,3,1

2,3,1 -> 2,1,3

loop2:

2,1,3 -> 1,2,3

1,2,3 -> 1,2,3

loop3:

1,2,3 -> 1,2,3

1,2,3 -> 1,2,3

package sorting;

import java.util.Arrays;

import org.junit.Test;

public class BubbleSorting {

    int[] items = { 4, 6, 1, 3, 7 };
int step = 0;
// ① 相邻
// ② 差一步
// ③ n个数可产生 n-1 对 @Test
public void sort() {
for (;;) {
boolean swapped = false;
for (int i = 0; i < items.length - 1; i++) {
step++;
if (items[i] > items[i + 1]) {
swap(i, i + 1);
swapped = true;
}
}
if (!swapped)
break;
} System.out.println(step + ":" + Arrays.toString(items));
} public void swap(int i, int j) {
int backup = items[i];
items[i] = items[j];
items[j] = backup;
} }

优化1(砍掉最后一个)

Now, the array is already sorted, but the algorithm does not know if it is completed. The algorithm needs one whole pass without any swap to know it is sorted.

loop1:

4,6,1,3,7 -> 4,6,1,3,7

4,6,1,3,7 -> 4,1,6,3,7

4,1,6,3,7 -> 4,1,3,6,7

4,1,3,6,7 -> 4,1,3,6,7

loop2:

4,1,3,6 -> 1,4,3,6

1,4,3,6 -> 1,3,4,6

1,3,4,6 -> 1,3,4,6

loop3:

1,3,4 -> 1,3,4

1,3,4 -> 1,3,4

无swap 结束

package sorting;

import java.util.Arrays;

import org.junit.Test;

public class BubbleSorting {

    int[] items = { 4, 6, 1, 3, 7 };
int step = 0;
// ① 相邻
// ② 差一步
// ③ n个数可产生 n-1 对
// ④ 把最大(小)数移到末尾,n = n -1 来缩小循环次数 @Test
public void sort() {
int l = items.length;
for (;;) {
boolean swapped = false; for (int i = 1; i < l; i++) {
step++;
if (items[i - 1] > items[i]) {
swap(i - 1, i);
swapped = true;
}
}
l = l - 1;
if (!swapped)
break;
} System.out.println(step + ":" + Arrays.toString(items));
} public void swap(int i, int j) {
int backup = items[i];
items[i] = items[j];
items[j] = backup;
} }

优化2(砍掉最后一段)

loop1:

4,6,1,3,7 -> 4,6,1,3,7

4,6,1,3,7 -> 4,1,6,3,7

4,1,6,3,7 -> 4,1,3,6,7

4,1,3,6,7 -> 4,1,3,6,7

loop2:

4,1,3 -> 1,4,3

1,4,3 -> 1,3,4

loop3:

1,3 -> 1,3

package sorting;

import java.util.Arrays;

import org.junit.Test;

public class BubbleSorting {

    int[] items = { 4,6,1,3,7 };
int step = 0;
// ① 相邻
// ② 差一步
// ③ n个数可产生 n-1 对
// ④ 找到最后一次交换下标,只保留前面部分
// ⑤ 当 最后一次交换下标 == 0 时,说明没有交换,则终止循环 @Test
public void sort() {
int l = items.length;
for (;;) {
int lastSwapIndex = 0;
for (int i = 1; i < l; i++) {
step++;
if (items[i - 1] > items[i]) {
swap(i - 1, i);
lastSwapIndex = i;
}
}
l = lastSwapIndex;
if (l < 1)
break;
} System.out.println(step + ":" + Arrays.toString(items));
} public void swap(int i, int j) {
int backup = items[i];
items[i] = items[j];
items[j] = backup;
} }

排序算法 (sorting algorithm)之 冒泡排序(bubble sort)的更多相关文章

  1. 排序算法(sorting algorithm) 之 选择排序(selection sort)

    https://en.wikipedia.org/wiki/Selection_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 4,6,1,3,7 -> ,3,7 1 ...

  2. 排序的本质是什么 冒泡排序 bubble sort

    import random def getRandomNums(min=4, max=20): n = random.randint(min, max) arr = [random.randint(1 ...

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

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

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

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

  5. 【排序算法】冒泡排序(Bubble Sort)

    0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2)  次交 ...

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

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

  7. 排序算法(sorting)

    学习到的排序算法的总结,包括对COMP20003中排序部分进行总结,部分图片来自COMP20003 有部分内容来自http://www.cnblogs.com/eniac12/p/5329396.ht ...

  8. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  9. 冒泡排序(Bubble Sort),比较次数优化改进

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  10. 算法之经典排序-冒泡排序(bubble sort)

    冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...

随机推荐

  1. c#+.net常用功能点

    1.比较差集合,排除不在集合中的,即data是data1排除data2剩下的数据 var data1 = new List<string>(); var data2 = new List& ...

  2. 反射调用DLL

    public static type GetClassType(string ClassName,string dllname) { Type ClassType =null; foreach(Ass ...

  3. 安装mysql数据库出现错误"系统找不到指定文件"

    http://blog.csdn.net/Marvel__Dead/article/details/63262641?locationNum=4&fps=1

  4. checkbox、radio控件和文字不对齐

    一般使用html控件的时候  单选按钮和复选框的控件和文字不对齐 给input控件加上   style="vertical-align: middle; margin-top: -2px; ...

  5. CentOS7更改运行级别

    Step 1:查看系统默认运行级别 [root@node-1 html]# systemctl get-default       //图形界面graphical.target [root@node- ...

  6. requests+django+bs4实现一个web微信的功能

    前言: 今天我们利用requests模块+django+bs4浏览器来实现一个web微信的基本功能,主要实现的功能如下 a.实现返回二维码 b.实现手机扫码后二维码变成变成头像 c.实现手机点击登陆成 ...

  7. tp3.2 上传文件及下载文件

    公共方法 UploadFile.class.php() // 开始 , , , ,];];,; ;; ::::::;,) {//文件上传失败 //捕获错误代码$this->error($file ...

  8. 关于@JsonIgnore的理解

    首先:@JsonIgnore是一个能够在后端发送给前端数据的时候对后端发送出的json字符串能够发挥作用的一个注解 如果比如user表,你在password这个属性上添加@JsonIgnore,就会s ...

  9. ListView的BeginUpdate()和EndUpdate()作用[z]

    [z]https://blog.csdn.net/u011108093/article/details/79448060 许多Windows 窗体控件(例如,ListView 和 TreeView 控 ...

  10. windows批量停止服务

    此代码适合有一定windows操作系统基础的人使用 @echo off for %%i in ( mysql OracleDBConsoleleak OracleMTSRecoveryService ...