冒泡排序算法的改进

冒泡排序算法的改进

前面说的传统的冒泡排序中每一趟排序只能找到一个最大值或最小值,效率低,基于这个缺点我们考虑利用在每一趟排序中进行正向和反向俩遍冒泡的方法一次可以得到俩个最终值(最大值和最小值),确定俩个值的位置,从而使排序趟数减少了一半。

初始顺序:49 38 65 97 76 13 27 49 按照从小到大冒泡

使用正向冒泡得到每趟循环的最大值。

使用反向冒泡得到每趟循环的最小值。

第一趟排序: 38 49 65 76 13 27 49 97
第一趟正向排序原理: 第一条记录49与第二条记录38比较 根据排序要求 49 下沉 38 上冒 数组变成(38 49 65 97 76 13 27 49),接着用第二条记录49与第三条记录65比较,根据排序要求 数组保持原样(38 49 65 97 76 13 27 49),以此类推第。直到把最大值下沉到逻辑上的最后一个位置。 第一趟排序的结果是(38 49 65 76 13 27 49 97)

第一趟反向排序原理:使用正向排好序的数组(38  49 65 76 13 27 49 97),最后一条记录97与它的前一个,根据排序要求小的上冒大的下沉,以此类推可以把最小值上冒到逻辑上的第一个位置(13  38  49 65 76  27  49  97)。

第二趟排序:13  27  38  49 65 49  76  97

第三趟排序:13  27  38  49 49 65  76  97

改进后的算法的代码实现。

@Test
     public void testMaoPao(){
        //定义待排序的数组 49,38,65,97,76,13,27,49
         int a[] ={49,38,65,97,76,13,27,49};
        //定义中间变量   用于俩个数字交换时的转换
         int tmp;
         for(int i = 0; i<a.length/2; i++){
             //正向循环 把最大这下沉到 j+1的位置
             for(int j = i;j<a.length-i-1; j++){
                 //前一个数大于后一个   下沉
                 if(a[j]>a[j+1]){
                     tmp = a[j];
                     a[j] = a[j+1];
                     a[j+1] = tmp;
                 }
             }
             //反向循环 把最小者上冒的i的位置。
             for(int j = a.length;j>i;j--){
                 // 后一个数比前一个数小   上冒 
                 if(a[j]<a[j-1]){
                     tmp = a[j];
                     a[j] = a[j-1];
                     a[j-1] = tmp;
                 }
             }
         }
         System.out.println(Arrays.toString(a));

     }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值