排序算法算法之Bubble Sort

引言

在接下来的一段时间里,我准备整理一下自己的博客。尽自己最大努力把几年前写过的文章都看一遍,把一些存在错误的文章修改一下、把没有必要修改的文章删掉以及把一些知识点不全的文章进行完善。之所以整理自己的博客有以下3点原因:

  • 回顾以前的文章可以让我了解到自己身上知识点的空缺,看看现在的自己是否已经把空缺弥补上
  • 我始终认为一个博客的好坏不是文章的多少而是文章的质量,所以随着自己技术的进步,我应该以现在的水平,尽最大努力去提高自己文章的质量
  • 博客上的文章毕竟不是只有我一个人能看到,所以我有责任来尽快修正先前文章的错误,以免误导其他人

我一年前写的文章排序算法汇总 少了一个Bubble Sort,因此在这篇文章中我想把Bubble Sort这个排序算法加入进来。

Bubble Sort 简介

Bubble Sort是所有排序算法中最简单的一个。它是一种基于比较排序的算法,这个算法主要的排序思想就是比较每一对相邻的元素,如果它们的顺序不对,就交换它们,最终直至所有的元素达到有序的状态。 下图是我从wikipedia上找到的动态图,它演示了Bubble Sort的排序过程,大家参考一下。

《排序算法算法之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

    原文作者:排序算法
    原文地址: https://blog.csdn.net/xlinsist/article/details/51823766
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞