经典算法系列之冒泡排序实战讲解

本文以java语言进行实例讲解冒泡排序,以及此算法的两种优化方法,希望能帮助你们。

1.什么是冒泡排序

冒泡排序:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数”滚动”到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置……第n-1(n为无序数据的个数)趟即能完成排序。

废话不多说了,下面是代码实现

package 八大排序算法;

public class BubbleSort1 {
    private int[] testArray={49,38,65,97,76,13,27,49,55,04};
    private int[] sortArray;
    private long startTime,endTime;
    public BubbleSort1(){
        startTime=System.nanoTime();
        sortArray=bubbleSort1(testArray);
        for(int a:sortArray){
            System.out.print(a+" ");
        }
        endTime=System.nanoTime();
        System.out.println("\n程序运行时间:"+(endTime-startTime)+"ns");
    }
    public int[] bubbleSort1(int[] target){
        if(target!=null&&target.length>1){
            for(int i=0;i<target.length-1;i++){
                for(int j=target.length-1;j>i;j--){
                    if(target[j]<target[j-1]){
                        int tmp=target[j];
                        target[j]=target[j-1];
                        target[j-1]=tmp;
                    }
                }
            }
        }
        return target;
    }
    public static void main(String[] args) {
        new BubbleSort1();
    }

}

优化冒泡排序1

package 八大排序算法;

public class BubbleSort2 {
    private int[] testArray={49,38,65,97,76,13,27,49,55,04};
    private int[] sortArray;
    private long startTime,endTime;
    public BubbleSort2(){
        startTime=System.nanoTime();
        sortArray=bubbleSort2(testArray);
        for(int a:sortArray){
            System.out.print(a+" ");
        }
        endTime=System.nanoTime();
        System.out.println("\n程序运行时间:"+(endTime-startTime)+"ns");
    }
    public int[] bubbleSort2(int[] target){
        int n = target.length;
        if (target != null && n != 1) {
//最多需要进行n-1躺,每一趟将比较小的元素移到前面,比较大的元素自然就逐渐沉到最后面了,这就是冒泡
            for (int i = 0; i < n-1; i++) {      
                boolean exchange = false;
                for (int j = n-1; j > i; j--) {
                    if(target[j] < target[j-1]){
                        int temp = target[j];
                        target[j] = target[j-1];
                        target[j-1] = temp;
                        exchange = true;
                    }
                }
                if (!exchange){    // 若 i 到 n-1 这部分元素已经有序,则直接返回
                    return target;
                }
            }
        }
        return target;
    }
    public static void main(String[] args) {
        new BubbleSort2();
    }
}

优化冒泡排序2

package 八大排序算法;
/*
此种情况对应的是如果有100个数的数组,仅前面10个无序,后面90个都已排好序且
都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,
且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历
到这个位置就可以了。
 */
public class BubbleSort3 {
    private int[] testArray={49,38,65,97,76,13,27,49,55,04};
    private int[] sortArray;
    private long startTime,endTime;
    public BubbleSort3(){
        startTime=System.nanoTime();
        sortArray=bubbleSort3(testArray);
        for(int a:sortArray){
            System.out.print(a+" ");
        }
        endTime=System.nanoTime();
        System.out.println("\n程序运行时间:"+(endTime-startTime)+"ns");
    }
    public int[] bubbleSort3(int[] target){
        if(target!=null&&target.length>1){
            int flag=target.length;
            while(flag>0){
                int k=flag;
                flag=0;
                for(int j=1;j<k;j++){
                    if(target[j-1]>target[j]){
                        int tmp=target[j];
                        target[j]=target[j-1];
                        target[j-1]=tmp;
                        flag=j;
                    }
                }
            }
        }
        return target;
    }
    public static void main(String[] args) {
        new BubbleSort3();

    }

}

不足之处:
为了测试各个算法的运行时间,加了时间函数来测试,不过,每次运行的实际时间都不定,导致第三个的运行时间不一定小于第一个以及第二个。
只能通过时间复杂度及空间复杂度来计算一个算法的优劣。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值