程序员必须掌握的三种简单排序算法(冒泡排序)

本文深入讲解冒泡排序的原理,包括排序过程、API设计、代码实现及时间复杂度分析。通过示例代码演示如何实现冒泡排序,并分析其在不同情况下的性能表现。

一、排序原理

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

在这里插入图片描述

二、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增到很大,它的时间复杂度会急剧上升
冒泡排序适用于待排序元素较少的时候使用.(对于大量元素这种排序性能是比较低的)


喜欢的话记得点赞收藏哟😊
数据结构与算法—博文专栏持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雄不是大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值