排序算法之冒泡排序
前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