引言
在接下来的一段时间里,我准备整理一下自己的博客。尽自己最大努力把几年前写过的文章都看一遍,把一些存在错误的文章修改一下、把没有必要修改的文章删掉以及把一些知识点不全的文章进行完善。之所以整理自己的博客有以下3点原因:
- 回顾以前的文章可以让我了解到自己身上知识点的空缺,看看现在的自己是否已经把空缺弥补上
- 我始终认为一个博客的好坏不是文章的多少而是文章的质量,所以随着自己技术的进步,我应该以现在的水平,尽最大努力去提高自己文章的质量
- 博客上的文章毕竟不是只有我一个人能看到,所以我有责任来尽快修正先前文章的错误,以免误导其他人
我一年前写的文章排序算法汇总 少了一个Bubble Sort,因此在这篇文章中我想把Bubble Sort这个排序算法加入进来。
Bubble Sort 简介
Bubble Sort是所有排序算法中最简单的一个。它是一种基于比较排序的算法,这个算法主要的排序思想就是比较每一对相邻的元素,如果它们的顺序不对,就交换它们,最终直至所有的元素达到有序的状态。 下图是我从wikipedia上找到的动态图,它演示了Bubble Sort的排序过程,大家参考一下。
尽管这个算法非常简单,但是在实际应用中很少使用,这是因为它在数据量很大的情况下是非常慢的。如果整个要排序的元素列表是接近有序的,那么Bubble Sort的速度还是挺快的,在这样的情况下,它的时间复杂度是 O(n) ,这里的 n 是要排序元素的数量。由于在接近有序的情况下,Bubble Sort的速度很快,我们可以用它来检查一个元素列表是否为有序的。
Bubble Sort 之 Java 实现
接下来我要用Java语言来实现Bubble Sort,并且用Java中的数组来存储待排序的元素。
package algorithms;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;
public class BubbleSort {
/** 想要生成的随机数个数 */
private static final int NUM = 20;
private static int[] eles;
// 由于类变量eles的初始化不能用一行代码完成,因此这里我用静态代码块
// 给大家一个关于Static Initialization Block的链接,它详细的解释了静态代码块的应用场景。
// http://stackoverflow.com/questions/2420389/static-initialization-blocks
static {
eles = new int[NUM];
for (int i = 0; i < NUM; i++)
// 虽然在静态代码块中是线程安全的,但是在Java 1.7或大于1.7的版本中,建议大家用ThreadLocalRandom生成随机数
eles[i] = ThreadLocalRandom.current().nextInt(0, 101);
}
/** * Bubble Sort 版本1 * @param arr 待排序的数组 */
public static void sort(int[] arr) {
boolean swapped = true;
while (swapped) {
swapped = false;
for (int i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1]) {
swap(arr, i, i - 1);
swapped = true;
}
}
}
}
/** * 交换数组中的两个元素 * @param arr 准备交换的数组 * @param i 交换元素的下标 * @param j 交换元素的下标 */
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/** * 这里我就用主函数做测试了。 */
public static void main(String[] args) {
System.out.println(Arrays.toString(eles));
BubbleSort.sort(eles);
System.out.println(Arrays.toString(eles));
}
}
其实上面的代码有一个不足之处。下面我来举个例子。假设我数组中的元素为6 5 1 7 8 9 10
,经过第一轮循环过后,元素的顺序变为了5 1 6 7 8 9 10
,现在我们可以看到后面的元素已经有序了,但是上面的算法依然需要比较后面所有已经处于正确位置上的元素,因此我们可以改正这个不足,减少Bubble Sort比较的次数。
/** * Bubble Sort 版本2 * @param arr 待排序的数组 */
public static void sort2(int[] arr) {
int n = arr.length;
while (n > 1) {
int newn = 0;
for (int i = 1; i < n; i++) {
if (arr[i] < arr[i - 1]) {
newn = i + 1;
swap(arr, i, i - 1);
}
}
n = newn;
}
}
Bubble Sort 总结
Bubble Sort是排序算法中最简单的一个。Donald Knuth在他的书中说:
Bubble Sort没有什么地方是吸引人的,除了它容易被记住的名字和引出的一些理论问题。
虽然Bubble Sort没有什么有用之处,但是对于一些算法的初学者来说,这是一个很好地例子。
全文完 – 2016.10.22