排序算法 (sorting algorithm)之 冒泡排序(bubble sort)
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)的更多相关文章
- 排序算法(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 ...
- 排序的本质是什么 冒泡排序 bubble sort
import random def getRandomNums(min=4, max=20): n = random.randint(min, max) arr = [random.randint(1 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
- 【排序算法】冒泡排序(Bubble Sort)
0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2) 次交 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 排序算法(sorting)
学习到的排序算法的总结,包括对COMP20003中排序部分进行总结,部分图片来自COMP20003 有部分内容来自http://www.cnblogs.com/eniac12/p/5329396.ht ...
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- 冒泡排序(Bubble Sort),比较次数优化改进
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 算法之经典排序-冒泡排序(bubble sort)
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...
随机推荐
- windows php exec()不生效问题
开始 $cmd = 'java -jar C:/xampp/htdocs/dev_env/replace_word_content.jar'; 报错java不是内部命令 换成 $cmd = 'C:\P ...
- 转载(TCPClient 建立连接和断开连接函数)
public bool networkbuild()//建立端口连接 { if (client == null) { try { client = new TcpClient(networkip, n ...
- MySql数据库执行insert时候报错:Column count doesn't match value count at row 1
遇到这个问题之后,第一反应就是前后列数不等造成的,但是我检查SQL之后,发现列数是相同得,但是插入还是有问题,然后又写了简单得SQL只插入不为空得字段,执行还是报这个错,最后请教了高人,指点之后,大概 ...
- python bmp转jpg 且灰度图转彩色
今天在简书,上看到了一个 bmp转jpg的代码,便记录一下. # coding:utf-8 import os from PIL import Image # bmp 转换为jpg,灰度图转RGB d ...
- 【笔记】Python基础二:数据类型之集合,字符串格式化,函数
一,新类型:集合 集合出现之前 python_l = ['lcg','szw','zjw'] linux_l = ['lcg','szw','sb'] #循环方法求交集 python_and_linu ...
- java PDF添加图层,支持多页图层添加
java PDF添加图层,支持多页图层添加 代码: import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...
- Pandas分组级运算和转换
分组级运算和转换 假设要添加一列的各索引分组平均值 第一种方法 import pandas as pd from pandas import Series import numpy as np df ...
- 字符编码:Unicode和UTF-8之间的关系
Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...
- rabbitmq 启动报错 Failed to get nic info
这个报错 基本搜索不到什么有效信息 解决办法: hostnamectl set-hostname xxx.local # 先把rabbitmq进程杀掉$ ps -ef | grep rabbitmq ...
- MathExam Lv2
一个大气又可爱的算术题----211606360 丁培晖 211606343 杨宇潇 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...