一、排序原理
- 比较相邻的元索。如果前一个元素比后一个元索大,就交换这两个元素的位置。
- 对每一对相邻元索做同样的工作 ,从开始第一对元索到结尾的最后一对元索。 最终最后位置的元索就是最大值。

二、API设计

三、代码实现
【Bubble .java】
package cn.Da_xiong.algorithm.Demo2.sort;
//冒泡排序 API
public class Bubble {
//方法一:对数组a中的元素进行排序
public static void sort(Comparable[] a){
//Comparable[] a:传入实现Comparable接口的类的数组
//每冒泡一次,下一次冒泡比较的次数就-1
for(int i=a.length-1;i>0;i--){
//第一次for循环是控制冒泡次数
//数组里有6个元素,冒泡5次就可以完成排序。索引是几就排几次
//数组的最大索引i = 数组长度-1
for(int j=0;j<i;j++){
//第二次for循环是控制每次冒泡过程中相邻元素比较的次数
//j是从索引为0的开始,到最大索引处(即i)
//比较索引j和索引j+1处的值;若j的值大于j+1的值,就交换位置
if(greater(a[j],a[j+1])){ //如果greater函数返回的值为true,说明v-w>0,即j处的值比j+1的值大
exch(a,j,j+1); //使用ecch方法交换j和j+1处的值
}
}
}
}
//方法二:比较v元素是否大于w元素
private static boolean greater(Comparable v,Comparable w){
//Comparable中提供有一个方法:ComparableTo
//ComparableTo返回的是int类型的结果
//判断v-w是否比0大,如果大就是true,小就false
return v.compareTo(w)>0;
}
//方法三:数据元素i和j交换位置
private static void exch(Comparable[] a,int i,int j){
//把i和j数据互换
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
【BubbleTest .java】
package cn.Da_xiong.algorithm.Demo2.test;
//冒泡排序
import cn.Da_xiong.algorithm.Demo2.sort.Bubble;
import java.util.Arrays;
public class BubbleTest {
public static void main(String[] args) {
Integer[] arr = {4,5,6,3,2,1};
Bubble.sort(arr);
//int[] arr = {4,5,6,3,2,1};这里如果使用这个会报错
//是因为上面使用的是int类型的数据,修改为Intefer就可以(Integer数据类型继承了Comparable接口)
//System.out.println(arr.toString()); 这样使用不对,会报错
System.out.println(Arrays.toString(arr));
}
}
【运行结果】

四、时间复杂度分析
冒泡排序使用了双层for循环,内层循环体才是真正完成排序的代码,因此主要分析内层循环的执行次数。
最坏情况:
例子:假如对6,5,4,3,2,1进行排序
每次冒泡,有6个元素就比较5次,比较的次数是n-1,因此:
元素比较的总次数为:(n-1)+(n-2)+(n-3)+...+2+1=(n^2-n)/2
最坏情况下,每次比较都需要交换元素,因此:
元素交换总次数为(n-1)+(n-2)+(n-3)+...+2+1=(n^2-n)/2 (与元素比较次数一样)
算法总执行次数为=元素比较总次数+元素总执行次数
=(n^2-n)/2+(n^2-n)/2
=n^2-n
根据大O推导法则,冒泡排序的时间复杂度为O(n^2)
O(n^2)这种时间复杂度的,一旦n增到很大,它的时间复杂度会急剧上升
冒泡排序适用于待排序元素较少的时候使用.(对于大量元素这种排序性能是比较低的)
喜欢的话记得点赞收藏哟😊
数据结构与算法—博文专栏持续更新!
本文深入讲解冒泡排序的原理,包括排序过程、API设计、代码实现及时间复杂度分析。通过示例代码演示如何实现冒泡排序,并分析其在不同情况下的性能表现。
546

被折叠的 条评论
为什么被折叠?



