冒泡排序算法

冒泡排序

【罗马尼亚舞团】算法的艺术 - 冒泡排序

1.冒泡排序规则

  • 两两比较,若a[i]>a[i+1],则交换两个元素,冒泡一遍能保证一个最值排到末尾;
  • 重复以上步骤,直到整个数组有序。
 public static void bubble(int[] a){
     for(int j=0;j<a.length-1;j++){
        for(int i=0;i<a.length-1-j;i++){
         if(a[i]>a[i+1]){
             swap(a,i,i+1);
          }
       }
     }     
 }

 public static void swap(int [] a,int i,int j){
     int t=a[i];
     a[i]=a[j];
     a[j]=t;
 }

2.优化方式

尽可能减少有序子序列的比较冒泡。

2.1 是否发生交换标记优化

标记是否发生交换,如果没有交换发生,则数组已经有序

 public static void bubble(int[] a){
     for(int j=0;j<a.length-1;j++){
         boolean swapped = false;

        for(int i=0;i<a.length-1-j;i++){
         if(a[i]>a[i+1]){
             swap(a,i,i+1);
             swaped = true;
          }
       }
       if(!swapped){
         break;
       }
     }     
 }

2.2 标记每次冒泡最后发生交换的位置

记录最后一次交换元素的索引位置(每一次冒泡过程),可以作为为第二次冒泡的比较次数。如果这个位置为0,则代表冒泡结束,数组有序。

 public static void bubble(int[] a){
     int n = a.length-1;//每次冒泡需要循环的次数
     while(true){
        int last = 0;//标识最后一次发生交换时的所谓位置
        for(int i=0;i<n;i++){
         if(a[i]>a[i+1]){
             swap(a,i,i+1);
             swaped = true;
             last = i;
          }
       }
       n = last;
       if(n == 0){
         break;
       }
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值