排序算法 (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)
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...
随机推荐
- c#+.net常用功能点
1.比较差集合,排除不在集合中的,即data是data1排除data2剩下的数据 var data1 = new List<string>(); var data2 = new List& ...
- 反射调用DLL
public static type GetClassType(string ClassName,string dllname) { Type ClassType =null; foreach(Ass ...
- 安装mysql数据库出现错误"系统找不到指定文件"
http://blog.csdn.net/Marvel__Dead/article/details/63262641?locationNum=4&fps=1
- checkbox、radio控件和文字不对齐
一般使用html控件的时候 单选按钮和复选框的控件和文字不对齐 给input控件加上 style="vertical-align: middle; margin-top: -2px; ...
- CentOS7更改运行级别
Step 1:查看系统默认运行级别 [root@node-1 html]# systemctl get-default //图形界面graphical.target [root@node- ...
- requests+django+bs4实现一个web微信的功能
前言: 今天我们利用requests模块+django+bs4浏览器来实现一个web微信的基本功能,主要实现的功能如下 a.实现返回二维码 b.实现手机扫码后二维码变成变成头像 c.实现手机点击登陆成 ...
- tp3.2 上传文件及下载文件
公共方法 UploadFile.class.php() // 开始 , , , ,];];,; ;; ::::::;,) {//文件上传失败 //捕获错误代码$this->error($file ...
- 关于@JsonIgnore的理解
首先:@JsonIgnore是一个能够在后端发送给前端数据的时候对后端发送出的json字符串能够发挥作用的一个注解 如果比如user表,你在password这个属性上添加@JsonIgnore,就会s ...
- ListView的BeginUpdate()和EndUpdate()作用[z]
[z]https://blog.csdn.net/u011108093/article/details/79448060 许多Windows 窗体控件(例如,ListView 和 TreeView 控 ...
- windows批量停止服务
此代码适合有一定windows操作系统基础的人使用 @echo off for %%i in ( mysql OracleDBConsoleleak OracleMTSRecoveryService ...