排序之冒泡排序

冒泡排序思想

对于一个数字序列来说,我们可以依次比较相邻的两项数字,假如相邻的两项分别记为A和B。如果A的值大于B,那么进行A、B之间顺序的交换,将较大值移到后面。之后再用第二个值与第三个值进行比较,将较大的值放到后面,以此类推。

冒泡排序示例

每次遍历一次序列,都会找到一个数的最终位置。文字讲解会比较抽象,以下为具体事例:

假设一个序列为:24 ,12,42,67,53,21,90,69

则排序过程如下:

第一趟排序(找0~n-1序列中最大的值,并放在最后的位置):
12,24,42,53,21,67,69,90
第二趟排序(找0~n-2序列中的最大值,放在倒数第二位置):
12,24,42,21,53,67,69,90
第三趟排序(确定倒数第三个位置)
12,24,21,42,53,67,69,90
第四趟排序(确定倒数第四个位置)
12,21,24,42,53,67,69,90

之后进行第五趟排序,在进行第五趟排序中发现当前序列中没有发生位置转换,则说明序列已经有序。

冒泡排序代码实现

private static void performSort(int[] array) {

        int length = array.length;
        //设置一个变量值,标记是否进行了序列移动
        boolean flag = true;
        while (flag) {
            flag = false;
            for (int i = 1; i < length; i++) {
                if (array[i - 1] > array[i]) {
                    int temp = array[i];
                    array[i] = array[i - 1];
                    array[i - 1] = temp;

                    flag = true;
                }
            }
            --length;
        }
    }

冒泡排序性能分析

(1)时间复杂度
在设置标志变量之后:
当原始序列“正序”排列时,冒泡排序总的比较次数为n-1,移动次数为0,也就是说冒泡排序在最好情况下的时间复杂度为O(n);

当原始序列“逆序”排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为3n(n-1)/2次,所以冒泡排序在最坏情况下的时间复杂度为O(n^2);

当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n^2)。

(2)空间复杂度
冒泡排序排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)。

(3)稳定性
冒泡排序在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值