正宗冒泡排序算法总结

关于冒泡排序的工作原理有几种,有的资料说是第k+x个位置与第k个位置比较(x>0的自然数),符合交换条件就交换。有的资料说是第k+1个位置与第k个位置比较。

  • 我刚查资料总结了一下。我觉得既然是冒泡,那就应该所有元素每一趟排序就应该最多往上冒一层。不可能是从水底直接冒到水面。
  • 所以正确的排序思想应该是:相邻的两个元素相比较,符合冒泡才冒泡(交换)。

根据上述的正宗原理:第一次得出的代码应该是:

package com.you.test;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int[] a = {8,1,6,2,5,7,3,4,9};
        int tmp = 0;//缓存区
        
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a.length-1;j++){
                if (a[j]>a[j+1]) {//符合冒泡,进行一次冒泡
                    tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;
                }    
            }
            //这一趟排序结束
            printa(a);
        }
        

    }
    
    public static void printa(int[] a) {
        for(int i=0;i<a.length;i++){
            System.out.print(" "+a[i]);
        }
        System.out.println("");
    }

}

运行结果:而且时间复杂度:n*n

  1. 解决内外循环次数问题。改进如下:
  2. package com.you.test;
    
    public class test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            int[] a = {8,1,6,2,5,7,3,4,9};
            int tmp = 0;//缓存区
            
            //大(小)的数一直往下沉,直到底,小(大)的数一层层往上冒。所以尾部部分是排好序的。
            for(int i=0;i<a.length-1;i++){
                for(int j=0;j<a.length-i-1;j++){
                    if (a[j]>a[j+1]) {//符合冒泡,进行一次冒泡
                        tmp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = tmp;
                    }    
                }
                //这一趟排序结束
                printa(a);
            }
            
    
        }
        
        public static void printa(int[] a) {
            for(int i=0;i<a.length;i++){
                System.out.print(" "+a[i]);
            }
            System.out.println("");
        }
    
    }


    运行结果:内部循环次数变小,外部不变

  3. 无效循环还是存在,接下来对无效循环改进:代码:

  4. package com.you.test;
    
    public class test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            int[] a = {8,1,6,2,5,7,3,4,9};
            int tmp = 0;//缓存区
            boolean is_changed = true;//冒泡标识,
            
            //大(小)的数一直往下沉,直到底,小(大)的数一层层往上冒。所以尾部部分是排好序的。
            while(is_changed){
                is_changed = false;
                for(int j=0;j<a.length-1;j++){
                    if (a[j]>a[j+1]) {//符合冒泡,进行一次冒泡
                        tmp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = tmp;
                        is_changed = true;//有元素冒泡,
                    }    
                }
                //这一趟排序结束
                printa(a);
            }
        }
        
        //打印
        public static void printa(int[] a) {
            for(int i=0;i<a.length;i++){
                System.out.print(" "+a[i]);
            }
            System.out.println("");
        }
    
    }

    运行结果:

  5. 到这里就可以就可以完美完成冒泡的改进啦。。。。

转载于:https://www.cnblogs.com/youyonggui/p/6118185.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值