Java实现冒泡排序完整记录(有源码)

目录

冒泡排序

编程思想

代码

总结


冒泡排序

编程思想

假设现在要对一组数{3,9,5,6,2,7}做从大到小排序,当然从小到大排序也是一样的,这里只是举例说明其思想。

我们首先要清楚这组数在计算机的存储情况:

数据截图

这个过程就好比是比武招亲,首先将第一个元素作为最大的元素(擂主),然后依次将后面的元素与这个最大的元素做比较(比武),如果有某一个元素真的比目前假设的元素值要大(比擂主厉害)就将其位置互换(换擂主)。

然后一轮比完了就选出了最大的元素(最强的擂主),这个时候就将最大的元素不考虑,将除去最大元素的剩下的元素再次进行比较。(除去最强的擂主继续比武)

重复执行程序直到最后一个元素为止。(直到最后的一个武士没有对手为止)。

到这里原来的数据就做了重新的排序。

代码


/**
 * @author  LJ
 * @Data 2021/1/10 13:07
 * Java冒泡排序
 */
public class Order {
    
    /**
     * 从小到大排序的方法
     * @param arr  待排序的数据
     * @return  排好序的数据
     */
    public static int[] minToMax(int[] arr){
        for (int i = 0; i < arr.length ; i++) {
            for (int j = i; j < arr.length; j++) {
                if (arr[i]>arr[j]){
                   arr[i]=arr[i]^arr[j];
                   arr[j]=arr[j]^arr[i];
                   arr[i]=arr[i]^arr[j];
                }
            }
        }
        return arr;
    }


    /**
     * 从大到小的排序方法
     * @param arr   待排序的数据
     * @return      排好序的数据
     */
    public static int[] maxToMin(int[] arr){
        for (int i = 0; i < arr.length ; i++) {
            for (int j = i; j < arr.length; j++) {
                if (arr[i]<arr[j]){
                    arr[i]=arr[i]^arr[j];
                    arr[j]=arr[j]^arr[i];
                    arr[i]=arr[i]^arr[j];
                }
            }
        }
        return arr;
    }
}

代码改进 ---将重复的代码进行复用,将交换数据的代码写成一个私有的静态方法


/**
 * @author  LJ
 * @Data 2021/1/10 20:16
 * Java冒泡排序  终极版 
 */
public class Order {

    static int[] arr;
    /**
     * 从小到大排序的方法
     * @param arr  待排序的数据
     * @return  排好序的数据
     */
    public static int[] minToMax(int[] arr){
        Order.arr=arr;
        for (int i = 0; i < arr.length ; i++) {
            for (int j = i; j < arr.length; j++) {
                if (arr[i]>arr[j]){
                    swap(i,j);
                }
            }
        }
        return arr;
    }


    /**
     * 从大到小的排序方法
     * @param arr   待排序的数据
     * @return      排好序的数据
     */
    public static int[] maxToMin(int[] arr){
        Order.arr=arr;
        for (int i = 0; i < arr.length ; i++) {
            for (int j = i; j < arr.length; j++) {
                if (arr[i]<arr[j]){
                    swap(i,j);
                }
            }
        }
        return arr;
    }

    private static void swap(int i,int j){
        arr[i]=arr[i]^arr[j];
        arr[j]=arr[j]^arr[i];
        arr[i]=arr[i]^arr[j];
    }
}


 自创代码的测试类:

/**
 * Order class的测试类
 */
public class DuBugOrder {
    public static void main(String[] args) {

        //排序初始化(准备两个数组)
        System.out.println("原数据为:8,4,7,10,17,14,11");
        int[] minMax=Order.minToMax(new int[]{8,4,7,10,17,14,11});
        int[] maxMin=Order.maxToMin(new int[]{8,4,7,10,17,14,11});

        //从小到大排序
        System.out.print("从小到大排序为:");
        for (int i = 0; i < minMax.length; i++) {
            System.out.print(minMax[i]+",");
        }
        System.out.println();

        //从大到小排序
        System.out.print("从大到小排序为:");
        for (int i = 0; i < maxMin.length; i++) {
            System.out.print(maxMin[i]+",");
        }
        System.out.println();
    }
}

 测试类的运行截图:

由于改进前后的测试截图都是一样的,所以这里就只放一张了哈(*^▽^*)

测试结果运行截图

总结

虽然这些东西看起来很简单,我在自己动手去做的时候也是这样觉得,但自己去做了才发现会有很多问题出现,然后自己又一步步的DeBug,进一步发现问题,解决问题,扎实基础,努力将根扎的更深,希望在未来面对工作中心中不会那么慌张,毕竟只有丰富的经济基础才能满足上层的爱情需求嘛!!!(愿将来的工作善待我,狗头保命)

言归正传,我在写这个代码的过程中发现的问题:

1、两个交换数据的代码有些重复,想写成一个类,但就发现报错了。

问题截图

 问题原因是静态方法不能调用非静态的方法,但有人会说那竟然要加static那就没必要定义成private的了吧,其实不然,还是应该定义成private。关于这个问题我专门写了一篇文章记录。

2、当第一个问题解决后就为两个数据交换当专门写一个方法(swap方法),但发现在写返回值的时候纠结了,到底是写void还是写int还是写成数组,最终发现写成啥都不成,因为Java语言是极力避免指针的,这里如果是指针还行,很明显java语言是无法实现了!所以不得不重复一些代码了。(好像与Java代码的复用精神背道而驰,狗头保命)刚发现这个问题解决了,就是在源代码(Order.class)的类当中加一个数组引用,其实就是C语言里面的指针,代码如下:

static int[] arr;

然后当用户调用minToMax或者maxToMin方法的时候就将数据传给这个静态的成员变量arr,代码如下:

Order.arr=arr;

最终完整的代码就是上面的改进版的代码(*^▽^*) 

最后,能坚持看到这里的小伙伴一定是对Java的世界充满了好奇,对知识充满了渴望,希望看到这里的小伙伴能在以后的道路上永不放弃,坚持到底,学习是痛苦的,但学成之后是快乐的,加油!!!

最后,最最最重要的就是感谢媳妇的不杀之恩,一直陪在我身边默默地陪我,看我写博客(*^▽^*),等我学好强大了定带媳妇出去好好逛逛!陪陪媳妇。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值