冒泡排序--你学废了吗?

这玩意学了好久了还是不会。。。。。。
看不懂就去搜一些动图来看吧,毕竟这玩意还是动起来容易理解一点。
https://www.cnblogs.com/onepixel/articles/7674659.html
在这里插入图片描述

public static <E extends Comparable<E>> void sort(E[] data){
        for (int i=0;i<data.length;i++){
            //data[n-i,n)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
            //通过冒泡在data[n-i-1)位置放上合适的元素(j变量不断从数组开头索引对比交换)
            for (int j=0;j<data.length-i-1;j++){
                if (data[j].compareTo(data[j+1])>0){
                    swap(data,j,j+1);
                }
            }
        }
    }

//优化1
    public static <E extends Comparable<E>> void sort2(E[] data){
        for (int i=0;i<data.length;i++){
            //data[n-i,n)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
            //通过冒泡在data[n-i-1)位置放上合适的元素(j变量不断从数组开头索引对比交换)
            boolean isSwap=false;
            for (int j=0;j<data.length-i-1;j++){
                if (data[j].compareTo(data[j+1])>0){
                    swap(data,j,j+1);
                    isSwap=true;//判断data中元素是否全部已排好序,如果全部排好序就不会进来了
                }
            }
            //isSwap==false;证明data已全部排好序,不用再循环判断了
            if (!isSwap)break;
        }
    }

    //优化2
    public static <E extends Comparable<E>> void sort3(E[] data){
        for (int i=0;i<data.length;){
            //data[n-i,n)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
            //通过冒泡在data[n-i-1)位置放上合适的元素(j变量不断从数组开头索引对比交换)
            int lastSwapIndex=0;//最后一次交换的位置,在这个变量之后的元素就已经排好序了
            for (int j=0;j<data.length-i-1;j++){
                if (data[j].compareTo(data[j+1])>0){
                    swap(data,j,j+1);
                    lastSwapIndex=j+1;
                }
            }
            i= data.length-lastSwapIndex;//得出后面有多少元素已经排好序了
        }
    }

	//换角度实现冒泡排序
    public static <E extends Comparable<E>> void sort4(E[] data){
        for (int i=0;i<data.length;i++){
            //data[0,i)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
            //通过冒泡在data[j-1]位置放上合适的元素(j变量不断从数组结尾索引对比交换)
            for (int j=data.length-1;j>i;j--){
                if (data[j-1].compareTo(data[j])>0){
                    swap(data,j-1,j);
                }
            }
        }
    }

    private static <E> void swap(E[] data,int j,int k){
        E temp;
        temp=data[j];
        data[j]=data[k];
        data[k]=temp;
    }
public static void main(String[] args){
        Integer[] data={6,8,3,9,2,4,0};
        BubbleSort sort=new BubbleSort();
        sort.sort(data);
        //sort.sort2(data);
        //sort.sort3(data);
        for (int i=0;i<data.length;i++){
            System.out.print(" "+data[i]);
        }
        System.out.println();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值