面试必会排序算法(1)java 实现冒泡排序讲解( 二 )

工具类为了让这个实现类使用起来更加方便 , 我们就模仿一下 jdk 中的方法 。 提供一个工具类:
package com.github.houbb.sort.core.util;import com.github.houbb.heaven.support.instance.impl.Instances;import com.github.houbb.sort.core.api.BubbleSort;import java.util.List;/** * 排序工具类 * @author binbin.hou * @since 0.0.1 */public final class SortHelper {private SortHelper(){}/*** 冒泡排序* @param泛型* @param list 列表* @since 0.0.1*/public static > void bubble(List list) {Instances.singleton(BubbleSort.class).sort(list);}}测试我们来验证一下排序算法 。
测试代码List list = RandomUtil.randomList(5);System.out.println("开始排序:" + list);SortHelper.bubble(list);其中 RandomUtil 是一个随机生成的工具 , 便于我们测试 , 实现如下:
package com.github.houbb.sort.core.util;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ThreadLocalRandom;/** * @author binbin.hou * @since 0.0.1 */public final class RandomUtil {private RandomUtil(){}/*** 随机列表* @param size 大小* @return 结果* @since 0.0.1*/public static List randomList(final int size) {List list = new ArrayList<>(size);Random random = ThreadLocalRandom.current();for(int i = 0; i < size; i++) {list.add(random.nextInt(100));}return list;}}日志为了便于理解 , 我们可以在排序实现中加一点日志:
if(current.compareTo(next) > 0) {swap(original, j, j+1);changeFlag = true;if(log.isDebugEnabled()) {String format = String.format("i=%s, j=%s, c=%s, n=%s, 排序后: %s",i, j, current, next, original);log.debug(format);}} else {if(log.isDebugEnabled()) {String format = String.format("i=%s, j=%s, c=%s, n=%s, 无变化: %s",i, j, current, next, original);log.debug(format);}}i,j 代表本次循环的 i,j; c 代表当前值 , n 代表 next 下一个值 。
测试日志如下:
开始排序:[77, 48, 10, 8, 28]i=0, j=0, c=77, n=48, 排序后: [48, 77, 10, 8, 28]i=0, j=1, c=77, n=10, 排序后: [48, 10, 77, 8, 28]i=0, j=2, c=77, n=8, 排序后: [48, 10, 8, 77, 28]i=0, j=3, c=77, n=28, 排序后: [48, 10, 8, 28, 77]-- 第一次冒泡 , 把最大的 77 排序到最右侧i=1, j=0, c=48, n=10, 排序后: [10, 48, 8, 28, 77]i=1, j=1, c=48, n=8, 排序后: [10, 8, 48, 28, 77]i=1, j=2, c=48, n=28, 排序后: [10, 8, 28, 48, 77]-- 第二次冒泡 , 把第二大的 48 排序到最右侧 i=2, j=0, c=10, n=8, 排序后: [8, 10, 28, 48, 77]-- 这次排序结束后 ,28 和 10 已经放在了对应的位置i=2, j=1, c=10, n=28, 无变化: [8, 10, 28, 48, 77]i=3, j=0, c=8, n=10, 无变化: [8, 10, 28, 48, 77]这个算法 , 是把小的值放在前面 , 所以只有当 c > n 的时候 , 才会发生排序 。
最后 i = 6, j = 2 的时候 , 已经排序完成 。
开源地址为了便于大家学习 , 上面的排序已经开源 , 开源地址:
欢迎大家 fork/star , 鼓励一下作者~~
小结希望本文对你有帮助 , 如果有其他想法的话 , 也可以评论区和大家分享哦 。
【面试必会排序算法(1)java 实现冒泡排序讲解】各位极客的点赞收藏转发 , 是老马持续写作的最大动力!
面试必会排序算法(1)java 实现冒泡排序讲解文章插图