三种冒泡排序法(java)

冒泡排序的分析:
1.普通:
public static void bubbleSort( int [] a ){
            int n = a . length , temp = 0;
            for ( int i =0; i < n ; i ++){
                 for ( int j =1; j < n - i ; j ++){
                      if ( a [ j -1]> a [ j ]){
                            temp = a [ j ];
                            a [ j ] = a [ j -1];
                            a [ j -1] = temp ;
                     }
                }
           }
     }
分析:相邻元素相比较,逆序则换位置,把最大(小)的元素放在数组最后,然后次大(小)......一直排完所有元素。时间复杂度为O(n2)。
2.改进后的冒泡排序:
      public static void bubblePro1( int [] a ) {
            int n = a . length ;
            boolean sorted = false ;
            while (! sorted ) { // 如果扫描过的数据都已经排好序,sorted结果是true,直接跳出循环
                 sorted = true ;
                 for ( int i = 1; i < n ; i ++) {
                      if ( a [ i - 1] > a [ i ]) {
                           sorted = false ; // 发生过a[i-1]>a[i],不能确定已扫描过的数是否已经排好
                            int temp = a [ i ];
                            a [ i ] = a [ i - 1];
                            a [ i - 1] = temp ; // 交换位置
                     }
                }
                 n --; // a[n-1]位已经是最大的数,n应减一
           }
     }
}
分析:可以在扫描过程中提前结束,这种情况发生的原因是,除了数组尾部的数据已经排好之外,前面的数据也已经排好。增加一个标志sorted,来判断前面部分的数据是否已经排好。
性能缺点:
123
如图,扫描过后3是已经排好的,1,2是仍然需要扫描的数。但是2的次序也已经排好,由于1是乱序的,因而也需要扫描,因此仍可以优化。

3.再改进后的冒泡排序:
      public static void bubblePro2( int [] a ){
            int n = a . length ;
            boolean sorted = false ;
            int label = 0;
            while (! sorted ) { // 如果扫描过的数据都已经排好序,sorted结果是true,直接跳出循环
                 sorted = true ;
                 for ( int i = 1; i < n ; i ++) {
                      if ( a [ i - 1] > a [ i ]) {
                            sorted = false ; // 发生过a[i-1]>a[i],不能确定已扫描过的数是否已经排好
                            int temp = a [ i ];
                            a [ i ] = a [ i - 1];
                            a [ i - 1] = temp ; // 交换位置
                            label = i ; //记录最后发生交换的位置
                     }
                }
                 n = label ; // label之后的数已经排好,不必再扫描
           }
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值