首先,正在看文章的靓仔,现在有个需求给你:
将已知的数组里面的值重新排序,按照从小到大的顺序打印输出;
你会怎么思考呢?
这个需求需要用到排序的算法,排序有很多种方式,比如
1.冒泡排序:(今天以这个为例)
2.选择排序:
3.插入排序
一 . 为啥叫冒泡排序呢?
一开始我也挺有疑问的,直到我将排序过程竖着看的时候,就豁然开朗了;
举个例子,一个数组长这样:
Integer[] arr = {85, 7, 9, 56, 47, 1, 2, 8, 5};
假如竖着看,就变成这样:
有没有觉得特别像一条鱼吐泡泡:
所以现在要做的就是将数组中的 数值大的元素“浮”到上面,就像吐泡泡,上面的泡泡更大(数值更大);
二 .手写冒泡排序代码:
不知道你理解了没,反正我是理解了,接下来上手写一个冒泡排序代码(使用java语言);
自定义冒泡排序工具类需要的方法有:
1.sort:遍历, 调用greater和exchange方法完成排序;
2.greater:比较两个相邻元素的大小;
3.exchange :交换两个元素的位置;
三 .撸代码tips(基础知识):(强烈建议自己思考写一下代码)
-
方法建议写static修饰,因为可以直接类名.调用,无需创建对象;
-
因为会涉及到排序,所以会涉及到Comparable接口的使用,在写测试类的时候就需要注意,新生成的数组用包装类型的,因为这里会涉及到一个基本数据类型和包装类型的区别:
2.1 int基本类型没有实现Comparable接口,而包装类Integer实现了Comparable接口;
-
循环条件的边界值的设定很关键,边界值定不好容易产生indexOutOfBoundsException的问题;至于具体定多少,可以看极限情况是什么条件:比如刚好第一个元素就是最大的数字,需要进行(arr.length-1)次调换,调换到最后一个位置;
四 .上代码:
package compare.bubble;
public class MyBubble {
//排序
public static void sort(Comparable[] a) {
//有length-1个元素需要进行交换的过程
//写法1
for (int i = a.length - 1; i > 0; i--) {
//要从索引0处的元素开始交换,最坏情况一直交换到length-1次;
for (int j = 0; j < i; j++) {
//比较假如a[j]比a[j+1]大,则交换位置
if (greater(a[j], a[j + 1])) {
exchange(a, j, j + 1);
}
}
}
}
//比较大小
public static boolean greater(Comparable c1, Comparable c2) {
return c1.compareTo(c2) > 0;
}
//交换位置
public static void exchange(Comparable[] a, int b, int c) {
//建立一个临时元素,用于交换中转
//第一个函数等号后面的元素就是下一个函数的等号前面的元素,首尾衔接,即完成交换
Comparable num = a[b];
a[b] = a[c];
a[c] = num;
}
}
写个测试类测试一下成果:
package compare.bubble;3
import java.util.Arrays;
public class MyBubbleTest {
public static void main(String[] args) {
Integer[] arr = {85, 7, 9, 56, 47, 1, 2, 8, 5};
MyBubble.sort(arr);
System.out.println(" 我是鱼:"+ Arrays.toString(arr));
}
}
运行输出结果:
留个问题供大家思考:
五:冒泡排序的时间复杂度是多少呢?
算法基本功之一:弄清时间复杂度_StefanSSSS的博客-CSDN博客首先时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并且确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作 T(n) = 0(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,其中f(n)是问题规模n的某个函数;说人话:衡量一个算法复杂程度的式子,相同环境条件下,肯定越简单速度越快;那我们追求的就是把时间复杂度高的优化...https://blog.csdn.net/StefanSSSS/article/details/120817896?spm=1001.2014.3001.5501
还没完,玩个游戏赢了得到答案!!!
游戏规则:找不同
皮一下很开心~
六:补充
1.冒泡排序:
2.选择排序:
3.插入排序
以上三种排序的算法时间复杂度都是O(n^2),随着数据量的增加,对性能的要求会越来越高,所以不是大数据量级别的推荐选择;有兴趣可以带着疑问再去自学一下,强烈建议亲手撸一下代码;
下次推文预告,手写个单向链表撸一撸~
如果上班不忙的话~



