【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序

冒泡排序

Bubble Sort的复杂度分析

什么是复杂度?

简单的来说当我们需要衡量算法的优异程度的时候就需要用到它。。。

对一个算法来说,我们一般用时间和空间这两个维度来衡量它。也就是算法的执行时间,以及算法需要占用多大的空间。。。

我们一般用O来表示复杂度。。。。

而O也有一项特殊的能力它能舍弃一个算法的所有低次项与常数,比如说有一个算法的复杂度为 7 n 3 + n 2 + n + 7 {7n^3+n^2+n+7} 7n3+n2+n+7,那么当我们需要表述他的复杂度的时候就可以说这个算法的时间复杂度为O( n 3 {n^3} n3)。也就是说可以删除 n 2 + n + 7 {n^2+n+7} n2+n+7 和常数7。

冒泡排序的时间复杂度O( n 2 {n^2} n2)
我们一般用最坏时间复杂度来衡量算法,所以一般所有算法时间复杂度说的都是最坏时间复杂度。

时间复杂度分析

而时间复杂度又分为

  • 最坏时间复杂度
  • 平均时间复杂度
  • 最优时间复杂度

冒泡排序的最坏时间复杂度O( n 2 {n^2} n2)

首先因为冒泡排序需要遍历数组中的所有数字所以这个时间就是n,举个例子如果你的数组是5个数字如[5,8,7,9,4],那么这个n就是5,也就是说这个时间n实际上就是步骤即计算机执行步骤n,遍历一个长度为5的数组至少需要5个步骤。

第二步以从小到大排列举例,对比相邻的两个数字如果第一个数字比第二个数字大那么就交换两个数字的位置反之对比下一个相邻的数字,直到将所有相邻的数字都进行了一边对比了一遍那么这个数组中最大的数字就在最右边,因为对每个数字都对比了一遍所以这个时间就是n-1,因为每个数字都不跟自己进行对比所以需要减一。所以它的执行步骤就是n-1

	举个例子如[5,8,7,9,4]
	第一次执行遍历对比5<8不动8>7交换8与7的位置数组就变成[5,7,8,9,4],之后对比8<9不动9>4交换9与4的位置数组就变成[5,7,8,4,9]这样这个数组的最大的值9就到最右边了。这样最后这个数字就不用考虑了。
	第二次执行遍历对比5<7不动7<8不动8>4交换8与4的位置数组变成[5,7,4,8,9]
	第三次执行遍历对比5<7不动7>4交换7与4的位置数组变成[5,4,7,8,9]
	第四次执行遍历对比5>4交换5与4的位置数组变成[4,5,7,8,9]这样就排列完毕了。。。。

将上面两个步骤结合起来就是n(n-1)也就是 n 2 − n {n^2-n} n2n 所以我们同过O进行表述的时候就是冒泡排序的最坏时间复杂度O( n 2 {n^2} n2)。

因为是最坏时间复杂度需要考虑全部情况。那么那个五个数字的数组进行排序的最坏的情况就是需要对比他们的每一个数字即5*5也就说需要对比25次才能将数组排列整齐。。。。。

冒泡排序的平均时间复杂度O( n 2 {n^2} n2)

这个我们倒是不经常提一般都是取最优和最坏的平均情况就是 n 2 {n^2} n2,这个平均时间复杂度是指冒泡排序在进行编程的时候有一定的优化空间,比如当对比到一半的时候发现数组就已经排好序了。这个时候就可以编程跳出这个遍历对比的循环了。。。。

不过因为对比遍历的数量级就放在那里所以平均也是n*n这个数量级,所以平均也是这个O( n 2 {n^2} n2)

冒泡排序的最优时间复杂度O( n {n} n)

这个就是我在进行冒泡排序的最好情况,就是遍历一次就能排好数组的顺序。因为实际上这种情况也是出现比较少,所以这个最优的时间复杂度也不会被纳入实际的情况的考虑范围这个了解一下就可以了。

空间复杂度分析

冒泡排序的空间复杂度O( n {n} n)

空间复杂度这个提的也是非常的少,因为在高速发展的今天我们常常会使用空间换时间的方法来提高我们的效率。基本上很少有人会提及空间,平时我们所说的算法的复杂度一般都是在说最坏时间复杂度。

冒泡排序的空间复杂度就是这个数组的长度n,无论是遍历也好对比也好都一定是需要n个位置来存放n个数。举个例子如果你的数组是5个数字如[5,8,7,9,4],那计算机一定是需要5个地方存放这五个数。也就是空间复杂度为n

而冒泡排序又需要一个位置来存放对比前后的数也就是空间复杂度为1

将上面两个结合来看即冒泡排序的空间复杂度为O( n + 1 {n+1} n+1)也就是说,冒泡排序的空间复杂度为O( n {n} n)。也就是说有5个数字的数组在进行对比的时候一定需要计算机留有6个位置来存放数字。。。。

Bubble Sort的编程实现思路

Bubble Sort的实现思路

这里是从小到大排列,把小改成大切换一下就能得到从大到小的排列算法。。。。。

  1. 在传入数组之后我们首先就需要遍历数组(也就是第一个for循环的作用)
  2. 寻找这个数组中的最大的这个数字将它放到最右边(也就是第二个for循环作用)
  3. 判断数组中的第一个相邻数字的大小如果小于就继续对比下一个相邻的数字反之如果大于交换两个数字的位置
  4. 声明一个中间的位置用来存放调整前后的数(如果没有这个中间变量直接交换了话就会发现小的那个数字被覆盖掉了就丢失了。。。。)
  5. 将数组中相邻的较大的与较小的在数组中进行位置交换。。。。。。
Bubble Sort的编程
public int[] bubbleSort(int[] array) {
    int temp;
    //声明中间变量也就是用于存放相邻的第一个数字防止在交换的过程中数组的第一个位置的数字被覆盖
    for (int i = 0; i < array.length - 1; i++) {//遍历数组
        for (int j = 0; j < array.length - 1 - i; j++) {//将最大数字放到最右边
            if (array[j] > array[j + 1]) {//判断相邻数字是否需要交换
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
                //这三行代码用于交换数组中相邻的数字
            }
        }
    }
    return array;
}
	对比例子思考代码[5,8,7,9,4]
	第一次执行遍历对比5<8不动8>7交换8与7的位置数组就变成[5,7,8,9,4],之后对比8<9不动9>4交换9与4的位置数组就变成[5,7,8,4,9]这样这个数组的最大的值9就到最右边了。这样最后这个数字就不用考虑了。
	第二次执行遍历对比5<7不动7<8不动8>4交换8与4的位置数组变成[5,7,4,8,9]
	第三次执行遍历对比5<7不动7>4交换7与4的位置数组变成[5,4,7,8,9]
	第四次执行遍历对比5>4交换5与4的位置数组变成[4,5,7,8,9]这样就排列完毕了。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值