算法:冒泡排序

频繁的交换操作:一趟排序,多次交换运算;
基本操作:交换运算;
集合始终都是完整的。

一趟排序,通过与相邻元素交换操作,把最大值移到最右边的目标位置。
过程:下标0开始与相邻元素比较,大于相邻元素则交换,直到对比到最右边元素,一趟排序停止,目标位置下标减一,继续由下标0开始,目标位置下标为0,整个排序终止。


冒泡排序过程图

代码实现

public class BubblingSort {

    public static void main(String[] arg) {
        int[] ints = {5, 4, 3, 2, 1};
//        bubblingSort(ints, ints.length - 1);
        bubblingSort2(ints);
        for (int i : ints) {
            System.out.print(i + "   ");
        }
    }

    /**
     * 递归方式实现冒泡排序
     *
     * @param ints
     * @param target
     * @return
     */
    public static int[] bubblingSort(int[] ints, int target) {
        if (target == 0) {
            return ints;
        }
        /**一次冒泡把最大值移到最右边位置*/
        for (int i = 0; i < target; i++) {
            if (ints[i] > ints[i + 1]) {
                int temp = ints[i + 1];
                ints[i + 1] = ints[i];
                ints[i] = temp;
            }
        }
        bubblingSort(ints, --target);
        return ints;
    }

    /**
     * 不适用递归方式实现冒牌排序
     */
    public static void bubblingSort2(int[] ints) {
        int targetIndex = ints.length - 1;
        while (targetIndex > 0) {
            for (int i = 0; i < targetIndex; i++) {
                if (ints[i] > ints[i + 1]) {
                    int temp = ints[i + 1];
                    ints[i + 1] = ints[i];
                    ints[i] = temp;
                }
            }
            --targetIndex;
        }

    }
}

介绍完冒泡排序,讲解一下冒泡的时间复杂度冒泡排序的时间复杂度为O(n^2)
时间复杂度
计算方法1.一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。
冒泡排序的时间复杂度计算过程:
冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排列,第一次大循环从第一个数(5)开始到倒数第二个数(2)结束,比较过程:先比较5和4,4比5小,交换位置变成4 5 3 2 1;比较5和3,3比5小,交换位置变成4 3 5 2 1……最后比较5和1,1比5小,交换位置变成4 3 2 1 5。这时候共进行了4次比较交换运算,最后1个数变成了数列最大数。第二次大循环从第一个数(4)开始到倒数第三个数(2)结束。进行3次比较交换运算。……所以总的比较次数为 4 + 3 + 2 + 1 = 10次对于n位的数列则有比较次数为 (n-1) + (n-2) + ... + 1 = n (n - 1) / 2,这就得到了最大的比较次数而O(N^2)表示的是复杂度的数量级。举个例子来说,如果n = 10000,那么 n(n-1)/2 = (n^2 - n) / 2 = (100000000 - 10000) / 2,相对10^8来说,10000小的可以忽略不计了,所以总计算次数约为0.5 N^2。用O(N^2)就表示了其数量级(忽略前面系数0.5)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值