java实现三种冒号算法的效率分析

使用冒泡算法实现 9 8 7 6 5 从小打到大排序

方法一

思路如下:

第一趟: 找出最大的数 9
第一次 8 9 7 6 5 9与8交换
第二次 8 7 9 6 5 9与7交换
第三次 8 7 6 9 5 9与6交换
第四次 8 7 6 5 9 9与5交换
第二趟:找出8
第一次 7 8 6 5 9 8与7交换
第二次 7 6 8 5 9 8与6交换
第三次 7 6 5 8 9 8与5交换
第四次 7 6 5 8 9 8与9交换
第三趟:找出7
第一次 6 7 5 8 9 7与6交换
第二次 6 5 7 8 9 7与5交换
第三次 6 5 7 8 9 7与8交换
第四次 6 5 7 8 9 8与9交换
第四趟:找出6
第一次 5 6 7 8 9 6与5交换
第二次 5 6 7 8 9 6与7交换
第三次 5 6 7 8 9 7与8交换
第四次 5 6 7 8 9 8与9交换

java 代码实现:

package com.bjsxt.sort.bubble;

import java.util.Arrays;


public class BubbleSort1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr ={9,8,7,6,5};     
        sort(arr);

    }

    public static void sort(int[] arr){
        int len =arr.length;
        for(int j=0;j<len-1;j++){
            System.out.println("第"+(j+1)+"趟");
            for(int i=0;i<len-1;i++){
                System.out.print("第"+(i+1)+"次");
                if(arr[i]>arr[i+1]){
                    int temp = arr[i];
                    arr[i] =arr[i+1];
                    arr[i+1] =temp;
                }
                System.out.println(Arrays.toString(arr));
            }
        }
    }


}

方法二

方法一中我们可以发现某些交换位置是重复的,比如第二趟的第四次和第三趟的第四次,所以有必要进行优化处理。

第一趟: 找出最大的数 9
第一次 8 9 7 6 5 9与8交换
第二次 8 7 9 6 5 9与7交换
第三次 8 7 6 9 5 9与6交换
第四次 8 7 6 5 9 9与5交换
第二趟:找出8
第一次 7 8 6 5 9 8与7交换
第二次 7 6 8 5 9 8与6交换
第三次 7 6 5 8 9 8与5交换
第三趟:找出7
第一次 6 7 5 8 9 7与6交换
第二次 6 5 7 8 9 7与5交换
第四趟:找出6
第一次 5 6 7 8 9 6与5交换

package com.bjsxt.sort.bubble;

import java.util.Arrays;

public class BubbleSort2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr ={9,8,7,6,5};     
        sort(arr);
    }
    //第二版本,减少每一趟的次数
    public static void sort(int[] arr){
            int len =arr.length;
            for(int j=0;j<len-1;j++){ //趟数
                System.out.println("第"+(j+1)+"趟");
                for(int i=0;i<len-1-j;i++){ //次数
                    System.out.print("第"+(i+1)+"次");
                    if(arr[i]>arr[i+1]){
                        int temp = arr[i];
                        arr[i] =arr[i+1];
                        arr[i+1] =temp;
                    }
                    System.out.println(Arrays.toString(arr));
                }
            }
        }

}

方法三

假设数据已经有序,后者经过某趟后有序 ,减少趟数
如: 8 1 2 3 4
第一趟: 1 2 3 4 8
第二趟: 1 2 3 4 8 没有交换停止循环

package com.bjsxt.sort.bubble;

import java.util.Arrays;

/**
 * 最终版本:考虑存在顺序
 * @author Administrator
 *
 */
public class BubbleSort {

    /**
     * @param args
     */
    public static void main(String[] args) {        
        int[] arr ={1,2,9,3,4};
        sortFinal(arr);
    }
    //第二版本,减少每一趟的次数
    public static void sortFinal(int[] arr){
            boolean sorted= true;
            int len =arr.length;
            for(int j=0;j<len-1;j++){ //趟数
                sorted =true; //假定有序
                for(int i=0;i<len-1-j;i++){ //次数
                    if(arr[i]>arr[i+1]){
                        int temp = arr[i];
                        arr[i] =arr[i+1];
                        arr[i+1] =temp;
                        sorted =false; //假定失败
                    }
                    System.out.println(Arrays.toString(arr));
                }
                if(sorted){ //减少趟数
                    break;
                }
            }
        }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值