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. Django启动报错笔记

    NO.1: You have 15 unapplied migration(s). Your project may not work properly until you apply the mig ...

  2. 网页html格式导出Excel.xls

    1.创建excel方法 /// <summary> /// 创建Excel表格 /// </summary> /// <param name="dt" ...

  3. ABAP 程序/接口调用其他程序的数据

    在ABAP遇到的业务场景中,可能会遇到一种情况,需要调用其他报表的数据来发送或者二次加工,这个时候又不想对源程序做大的改动.有以下几种思路解决. 1.修改源程序,将需要展示的数据存储到DB中,然后主程 ...

  4. Win10系统总是提示"在商店中查找应用"的关闭方法

    Win10系统总是提示"在商店中查找应用"该怎么关闭?win10中打开文件的时候总是提示在商店中查找应用,但是自己的电脑中有程序可以打开这个文件,不需要去商店中下载,该怎么取消这个 ...

  5. 《Orange‘s》Loader

    Loader 作用 引导扇区只有512个字节,能做的事情很少,局限性太大.所以需要一个程序,通过引导扇区加载入内存,然后将控制权交给它,这样就突破了512字节的限制.这个程序便是loader. 加载过 ...

  6. [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

    题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...

  7. project5 大数据

    [概念] build和run不是一样的,要看输出,不要误解. [方法论] 先要搞懂每个方法的使用,不能乱写.文件名不要写成字符串内容. 又忘记用lab code了,该死. programcreek是个 ...

  8. sql基本的增删查改语句

    1.增---用于向表中插入新的行/数据 语法:insert into 表名(值1,值2,值3...) values(值1,值2,值3,...) 或者 语法:insert [into] <表名&g ...

  9. 如何将一段文本编译成C#内存程序的过程

    string code = null; // 1. 生成要编译的代码.(示例为了简单直接从程序集内的资源中读取) Stream stram = typeof(CodeDOM).Assembly .Ge ...

  10. 一篇文章搞定百度OCR图片文字识别API

    一篇文章搞定百度OCR图片文字识别API https://www.jianshu.com/p/7905d3b12104