天天看点

排序算法之冒泡排序排序算法之冒泡排序

排序算法之冒泡排序

前2段是废话可直接看第3段,coding多年一些常见算法及原理还是记得的,平时习惯了IDE去 “.” 出一些方法,在跳槽面试中让编写算法及优化时也是抓瞎,其实算法原理应该是上动态图片更直观些的,无奈曾经遇到过大神制作的动图没有保存,自己又比较笨拙不会制作,但文章结尾会贴出本人参照较好的文章供大家一起分析。

在此也声明下,本人学习期间会参照一些老师及大神的书籍或博客,个人认为我不懂就要和懂的人学习知识并吸收总结成自己的,这其实没有什么丢人的,所以博客、代码均通过收集资料分析、编写、优化、测试及总结整理后书写博客与大家分享,目的在于自我加深印象,分享及传播知识。希望大家就实际问题相互学习探讨,请勿互掐。

冒泡排序:核心是元素交换。通过元素两两比较进行交换,如此循环往复直至完成,可参照参考博客[1] 图解了解过程(这篇写的还是不错的),可参照参考博客[2] 动图。

直接上测试代码:

import java.util.Arrays;

/**
 * @Author: Wenx
 * @Description: 冒泡排序
 * @Date: Created in 2020/3/5 17:15
 * @Modified By:
 */
public class BubbleSort<T extends Comparable<T>> implements Sort<T> {
    @Override
    public void sort(T[] values) {
        int count = 0;
        int size = values.length;
        // 优化外层循环,若本轮比较未发生交换,说明数组已排序完成,取消后续比较
        boolean unfinished = true;
        // 优化内层循环,若本轮比较此位置之后未发生交换,说明数组此位置之后已排序完成,取消此位置之后比较
        int limit = size - 1;
        for (int i = 1, last = 0; i < size; i++, limit = last) {
            if (!unfinished) {
                System.out.println("由于上轮比较未发生交换,说明数组已排序完成,取消后续比较");
                break;
            }
            unfinished = false;
            System.out.println("limit:" + limit);
            for (int j = 0; j < limit; j++) {
                System.out.printf("[比较%02d次][第%02d轮,本轮第%02d次]%s",
                        ++count, i, j + 1, Arrays.toString(values));
                if (values[j].compareTo(values[j + 1]) == 1) {
                    System.out.printf("[(第%d位)%d > %d(第%d位) 进行交换]",
                            j + 1, values[j], j + 2, values[j + 1]);
                    unfinished = true;
                    last = j;
                    T t = values[j];
                    values[j] = values[j + 1];
                    values[j + 1] = t;
                }
                System.out.println();
            }
        }
        System.out.printf("共比较%02d次 ", count);
    }

    public static void main(String[] args) {
        Integer[] values = {1, 5, 4, 3, 2, 6, 7, 8, 9};
        Sort<Integer> sort = new BubbleSort<>();
        long startTime = System.currentTimeMillis();
        sort.sort(values);
        long endTime = System.currentTimeMillis();
        System.out.printf("耗时:%d ms, %s\n", endTime - startTime, Arrays.toString(values));
    }
}
           

留个接口方便后续操作:

/**
 * @Author: Wenx
 * @Description: 排序接口
 * @Date: Created in 2020/3/5 17:15
 * @Modified By:
 */
public interface Sort<T extends Comparable<T>> {
    void sort(T[] values);
}
           

总结:重点在于理解原理,使之变为自己的知识,编码可参照众多实现形式,每个人理解及想法均有差异,结合他人及自己想法转化实践就好了~

参考博客:

[1] https://blog.csdn.net/zcl_love_wx/article/details/83576962

[2] https://blog.csdn.net/dp_dp/article/details/80543290