经典排序算法之冒泡排序

冒泡排序

方法

给定数组n,要求升序

先看n[0],n[1]位置上的数,如果n[0]>n[1],则交换,否则不交换

再看n[1],n[2]位置上的数,如果n[1]>n[2],则交换,否则不交换

… 到最后一个数,那么最后一个数就是最大的

然后对[0,N-2]中的数,重复以上步骤

… 重复以上步骤,

直到整个数组呈升序排列

代码实现

public class BubbleSort {
    public static void sort(int[] arr) {
        //当数组长度为0或者1的时候,就没有必要排序,直接返回就行了
        if (arr == null || arr.length < 2){
            return;
        }
        //end就是循环多少次,第一次就是[0,end],第二次就是[0,end-1],以此类推
        //规定一个每次缩减的范围
        for (int end = arr.length-1;end > 0;end --){
            //范围固定之后
            //从0位置开始和1位置比较,如果大于就交换,小于等于不动,然后开始比较1和2位置的数,以此类推
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i+1]){
                    //自己封装了一个工具类就是简单交换
                    ArraySwapTool.swap(arr,i,i+1);
                }
            }
        }
    }
}

时间复杂度分析

for (int end = arr.length-1;end > 0;end --){
    for (int i = 0; i < end; i++) {
        //for循环里面都是常数操作
        if (arr[i] > arr[i+1]){ 
            ArraySwapTool.swap(arr,i,i+1);
        }
    }
}

第一个for循环就是确定一个递减的范围,并没有对样本量进行操作,第二个循环才是对缩减范围中的样本量进行操作,每一次操作一个递减范围,就是N-1+N-2+N-3+…+1,一直过一个递减的范围,那么最后的表达式就是一个等差数列求和,那么就是O(n^2)

所以冒泡排序的时间复杂度就是O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值