【排序算法】冒泡排序

1.基本介绍

冒泡排序的基本思想:重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。即两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

2.数据演示

例如:

第0次排序:5  1  6  3  2  9

第1次排序:1  5  3  2  6  9

第2次排序:1  3  2  5  6  9

第3次排序:1  2  3  5  6  9

第4次排序:1  2  3  5  6  9

第5次排序:1  5  6  9 

在第一次排序中:1小于5交换位置,然后5和6比较,位置不变,然后6和3比较,交换位置,然后6和2比较,交换位置,最后6与9比较,位置不变,最后第一次确定的最大值为9放在最后;

在第二次排序中:1和5位置不变,然后5与3比较,交换位置,接着5与6比较不变,确定第二大的数为6;

在第三次排序中:1和3比较位置不变,3和2比较,交换位置,最后3与5比较不变,确定5为第三大的数字;

在第四次比较中:1和2不变,之后2与3比较位置不变,最后确定3第四大的数;

在第五次比较中:1和2比较,位置不变,所以排序完毕;

即每次交换时,都要将最大的数放在队尾部分,且最后一次交换后,最小的数就不用比较了,所以循环次数为数组长度减去1;

3.算法思路

小编认为,在写代码时,要用两个循环嵌套,内循环进行数字的交换,外循环来确定内循环执行几次,且在内循环中要完成数组元素的交换。

4.代码如下

public class bubble {
    public static void main(String[] args) {
        int temp=0;
        int index=0;
        int arr[]={5,1,6,3,2,9};
        for (int j = 0; j < arr.length-1 ; j++) {
            for (int i = 0; i < arr.length-1 ; i++) {
                if(arr[i]>arr[i+1]){
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            index++;
            System.out.println("第"+index+"次排序后"+ Arrays.toString(arr));
        }
        System.out.println("排序结束,最终排序为"+Arrays.toString(arr));
    }
}

 在算法中交换两个数值要先用一个变量存储其中一个值,然后在交换后,将变量赋值给另一个即可完成交换。

演示结果:

第1次排序后[1, 5, 3, 2, 6, 9]
第2次排序后[1, 3, 2, 5, 6, 9]
第3次排序后[1, 2, 3, 5, 6, 9]
第4次排序后[1, 2, 3, 5, 6, 9]
第5次排序后[1, 2, 3, 5, 6, 9]
排序结束,最终排序为[1, 2, 3, 5, 6, 9]

5.代码优化

如上图演示的过程,在排序中,数组已经有序,但是仍要按循环规定次数执行,所以小编认为在排序过程中,我们可以加条件实现循环的跳出。

代码如下:

public class bubble {
    public static void main(String[] args) {
        int temp=0;
        int index=0;
        boolean bool=false;
        int arr[]={5,1,6,3,2,9};
        for (int j = 0; j < arr.length-1 ; j++) {
            for (int i = 0; i < arr.length-1 ; i++) {
                if(arr[i]>arr[i+1]){
                    bool=true;
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            index++;
            if(bool==false){
                break;
            }else {
                bool=false;
            }
            System.out.println("第"+index+"次排序后"+ Arrays.toString(arr));
        }
        System.out.println("排序结束,最终排序为"+Arrays.toString(arr));
    }
}

小编这里加入了if语句,如果发没发生元素的位置交换就直接跳出循环。

演示结果:

第1次排序后[1, 5, 3, 2, 6, 9]
第2次排序后[1, 3, 2, 5, 6, 9]
第3次排序后[1, 2, 3, 5, 6, 9]
排序结束,最终排序为[1, 2, 3, 5, 6, 9]

6.时间演示 

小编在循环前后加入了两端代码,当随机的数有100000个时,排序需要16秒,所以排序时间很长。(当然不能输出元素哈,太多了)

7.总结

冒泡排序的优点是简单易懂,容易实现。但缺点也很明显,就是效率较低,在数据量较大时不适合使用。其平均时间复杂度为 O(n²),空间复杂度为 O(1)。

限于小编能力有限,本篇难免会有一些瑕疵,希望各位uu提出宝贵意见。

 觉得有用就点个赞吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值