冒泡及改进(java实现)

冒泡排序java实现

冒泡核心就是两层for。
冒泡就是从数组的第一位开始比较大的放后面,小的放前面(从小到大排序),所以每一次循环结束,总是数组中最大的,在最后面。外层的for循环,就是将内层每次最大的数排除在外。下面是简单的java实现。

public class BubbleSort {
    public static void main(String[] args) {
        double[] density = {0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,
                0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719};
        BSort sort = new BSort(density);
        sort.show();
        sort.sort();
        sort.show();
    }
}

class BSort {
    private double[] density;
    private double temp = 0;
    BSort(double[] density) {
        this.density = density;
    }
    public void sort() {
        int j;
        for(int i=density.length-1; i>=0; i--) {
            for(j=0; j<i; j++) {
                if (density[j+1] < density[j]) {
                    temp = density[j];
                    density[j] = density[j+1];
                    density[j+1] = temp;    
                }
            }
        }
    }
    public void show() {
        for(int i=0; i<density.length; i++) {
            System.out.print(density[i] + " ");
        }
        System.out.println(" ");
    }
}

第一次改进

下面是第一次改进的代码(改进的:当数组排序完成则结束排序,即跳出for),下面注释掉的是计算程序运行时间的,可惜每个程序的运行时间都太短了,每次输出都是0ms。

public class ImprovedBubbleSort {

    public static void main(String[] args) {
        double[] density = {0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,
                0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719};
        BSort sort = new BSort(density);
        sort.show();
//      long begin = System.currentTimeMillis();
        sort.sort();
//      long end = System.currentTimeMillis();
//      long spendTime = end - begin;
        sort.show();
//      System.out.println("程序的开始时间为:"+begin+"  程序的结束时间为" + end+ "  程序运行时间为:" + spendTime);
    }
}

class Sort {
    private double[] density;
    private double temp = 0;
    boolean flag = false;           //标记,如果内部的循环没用没用交换,则数组已排序完成
    Sort(double[] density) {
        this.density = density;
    }
    public void sort() {
        int j;
        for(int i=density.length-1; i>=0; i--) {
            for(j=0; j<i; j++) {
                if(density[j+1] < density[j]) {
                    flag = true;
                    temp = density[j];
                    density[j] = density[j+1];
                    density[j+1] = temp;    
                }
            }
            if(flag) {
                break;
            }
        }
    }
    public void show() {
        for(int i=0; i<density.length; i++) {
            System.out.print(density[i] + " ");
        }
        System.out.println(" ");
    }
}


第二次改进

第二次改进:需定义变量lastExchange表示上次循环中最后一次交换的位置。冒泡排序最后一次交换位置后面的区域是有序且全部大于前面区域的,所以排序时需要排除掉这些,但是在外层循环中修改i–有困难,所以就修改内层循环的判断条件,将j < <script type="math/tex" id="MathJax-Element-3"><</script>i改为j < <script type="math/tex" id="MathJax-Element-4"><</script>lastExchange即可。下面是java的实现:

public class SecondImprovedBubbleSort {

    public static void main(String[] args) {
        double[] density = {0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,
                0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719};
        BSort sort = new BSort(density);
        sort.show();
        sort.sort();
        sort.show();
    }
}

class SISort {
    private double[] density;
    private double temp = 0;
    private boolean flag = false;           //标记,如果内部的循环没用没用交换,则数组已排序完成
    private int lastSwap = density.length-1;           //标记最后一次交换的位置,此位置之后的全为有序且大于之前,所以排除在下次排序之外
    SISort(double[] density) {
        this.density = density;
    }
    public void sort() {
        int j;
        for(int i=density.length-1; i>=0; i--) {
            for(j=0; j<lastSwap; j++) {
                if(density[j+1] < density[j]) {
                    flag = true;
                    temp = density[j];
                    density[j] = density[j+1];
                    density[j+1] = temp;
                    lastSwap = j;
                }
            }
            if(flag) {
                break;
            }
        }
    }
    public void show() {
        for(int i=0; i<density.length; i++) {
            System.out.print(density[i] + " ");
        }
        System.out.println(" ");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值