排序---冒泡排序

冒泡排序

  • 冒泡排序原理

  • Java代码

  • 总结

冒泡排序原理

图1
如图1:
冒泡排序:即将这样一连串的泡泡(各种可比较大小的数据),通过两两相比较的办法,排列出一定的顺序。
以从小到大的排序顺序为例,需要一下步骤:
1.从上到下依次两两相比较,若上面的大于下面的则交换位置,否则位置不变,直到最后两个元素比较完成,这样的操作称为一趟比较,第一趟比较一定是将最大的泡泡排在最后一个位置。
2.同理,第二趟是将第二大泡泡排在倒数第二位置,所以只需比较到倒数第二个位置,因为最后一个位置的泡泡已经确定。
3.依次方法,直到第一个泡泡位置确定
4.n个泡泡,每次确定一个泡泡的位置,所有一共需要n趟排序。

Java代码

package cn.com.mp.sort;

public class BubbleSort {
    public static void main(String[] args) {
        //int[] array = { 2, 3, 5, 6, 7, 9, 45, 56, 90 };
        int[]  array={56,2,8,5,9,46,53,7,1};
        sort(array);
    }

    /* 定义冒泡排序算法 */
    public static void sort(int[] array) {

        int len = array.length;//数组长度,一共多少元素
        /*
         * 1.从数组的最后一个元素到第一个元素,定义len趟排序
         * 2.倒着遍历数组的好处:方便控制每一趟里面进行多少次比较
         * 
         **/
        for (int i = len - 1; i >= 0; i--) {
            /*
             * 定义标识位flag=false;若发现交换则flag=true
             * 一趟比较结束,判断flag,若为false则证明整个一趟没有交换一个数据
             * 则也证明所有元素都已经是排序好的,此时为节省运行时间就可以马上结束程序,提高效率
             * */
            boolean flag = false;
            /*
             * 定义每一趟里面需要多少次比较,即判断条件为j<i,以第一趟为例
             * 1.第一趟:就需要比较0到len-2下标的元素,即第一个元素到倒数第二个元素
             * 2.不定义为j<=i原因:if语句中会对j+1进行判断,即也会判断到最后一个元素
             * 3.若条件定义为j<=i,则判断最后一个元素时,j+1已经不在数组中,会发生数组下标越界的错误
             * */
            for (int j = 0; j < i; j++) {
                /*
                 * 相邻元素两两进行比较,当前一个元素严格大于后一个元素时,两元素交换位置
                 * */
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    flag = true;
                }
            }
            /*
             * 判断是否发生过交换,若没有,则结束比较,证明所有元素已经是排序好的
             * */
            if (!flag) {
                break;
            }
        }
        /*
         * 遍历输出结果
         * */
        for (int i = 0; i < len; i++) {
            System.out.print(array[i] + "   ");
        }
    }
}

运行结果:
这里写图片描述

总结:

1.时间复杂度:
最好情况,所有的元素都已经排序好,只进行一趟排序,一次for循环,所以时间复杂度为O(n)
最坏情况,元素乱序,需要进行n趟排序,两层for循环,所以时间复杂度为O(n^2)
2.稳定性
因为定一个严格的判断,只有if(array[i]>array[i+1]),即前一个元素完全大于后一个元素时才交换位置,相等时并不交换位置,保证了稳定性,所以冒泡排序是稳定性排序
3.建议
建议建立断点,使用Junit跟踪调试当数组已经是排序好的情况,用于验证flag标识位的优势。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值