【基础排序】之冒泡排序

虽然很简单,但也要踏踏实实一步一步的进行学习啊!


算法评价

  • 时间复杂度:平方阶

  • 空间复杂度:常量阶

  • 稳定性:稳定

  • 适用数据规模量:小规模

算法复杂度与数据规模量关系图

算法原理简述(小白可读)

冒泡排序的原理:若一个数组中共有n个元素,则一共会比较n-1轮,每一轮又会比较很多次。

第一轮,
           第一次:第一个数和第二个数比较,比较换值后(如果前面那个数比后面那个数大的话,
                         需要互换值),保证大的数排后面,小的数排前面,

           第二次:第二个数和第三个数比较……

           第三次:第三个数和第四个数比较……

            ……

           第n-1次,第n-1个数和第n个数比较……

         (第一轮结束后,就保证第n个数是这个数组中的最大的数。第一轮比较了n-1次)

第二轮,
           第一次:第一个数和第二个数比较

           第二次:第二个数和第三个数比较……

            ……

           第n-2次:第n-2个数和第n-1个数比较……

         (第二轮结束后,就保证第n-1个数是这个数组中的第二大的数。第二轮比较了n-2次)

……

第n-1轮,
           第一次: 第一个数和第二个数比较。

           第n-1轮结束后,就完成了这个数组的升序排列。第n-1轮比较了1次)

算法演示图

Java对冒泡排序的实现(工具类)

import java.util.List;

/**
 * 冒泡排序的Java实现
 *
 * @author JustryDeng
 * @date 2019/4/25 18:56
 */
public class Bubble {

    /**
     * 冒泡排序的java实现
     *
     * 提示: 泛型Integer可换为任何一个 实现了Comparable<>接口的类
     *
     * 注: 这里没考虑元素本身为null的问题
     *
     * @param list
     *            要被排序的对象集合
     * @param asc
     *            升序/降序。 true-升序; false-降序
     *
     * @return 排序后的集合(P.S:其实就算不返回任何值, 调用sort方法后,原list中的元素位置也会被排序)
     * @date 2019/4/25 21:30
     */
    public static List sort(List<Integer> list, boolean asc) {
        if (list == null || list.size() <= 1) {
            return list;
        }
        // 控制升序、降序
        int leftAdd = asc ? 0 : 1;
        int rightAdd = asc ? 1 : 0;
        // 优化: 在进行了某轮循环后,发现所有的元素都已经是有序的了,那么就不需要再循环判断比较了;
        boolean noNeedContinueSort;

        int size = list.size();
        int result;
        Integer tmp;
        for (int i = 0; i < size; i++) {
            noNeedContinueSort = true;
            for (int j = 0; j < size - i - 1; j++) {
                /// 比较
                // 假设A.compareTo(B)结果为res:若A > B,则res > 0;若A == B,则res == 0;若A < B,则res < 0
                result = list.get(j + leftAdd).compareTo(list.get(j + rightAdd));
                if (result <= 0) {
                    continue;
                }
                /// 互换
                tmp = list.get(j + 1);
                list.set(j + 1, list.get(j));
                list.set(j, tmp);
                noNeedContinueSort = false;
            }
            if (noNeedContinueSort) {
                break;
            }
        }
        return list;
    }

}

测试一下

控制台输出:

由此可见,冒泡排序工具类编写成功!

^_^ 如有不当之处,欢迎指正

^_^ 本文已被收录进《程序员成长笔记(五)》,笔者JustryDeng

猜你喜欢

转载自blog.csdn.net/justry_deng/article/details/89527401