Java冒泡排序算法,通俗易懂

冒泡排序

概念

重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序如从小到大、首字母从A到Z)错误就把他们交换过来。

原理

依次比较相邻的两个数,将数字小的放在前面,数字大的放在后面。

示例代码

/**
 * 冒泡排序
 */
public class BubbleSort {

    public static int[] sort(int[] arr){

        for (int i = 1; i < arr.length; i++) { // 外层for循环控制的是总的比较趟(轮)数

            for (int j = 0; j < arr.length-i; j++) { // 内层for循环控制的是每趟两两比较的次数

                // 判断数组中的第j个元素是否比第j+1的元素大,大则进入判断语句中
                if (arr[j] > arr[j+1]){
                    // 创建一个临时变量tmp,存放arr[j]位置的值
                    int tmp = arr[j];
                    // 将arr[j+1]位置的值覆盖到arr[j]的位置
                    arr[j] = arr[j+1];
                    // 将临时变量tmp的值覆盖到arr[j+1]的位置
                    arr[j+1] = tmp;
                }
            }
        }
        return arr;
    }

    // 测试
    public static void main(String[] args) {
        int[] arr = {1,4,2,5,6,8,3};
        int[] sort = sort(arr);
        for (int result:sort){
            System.out.print(result+" ");
        }

    }
}

打印结果:
在这里插入图片描述

思路整理(画图说明)

在这里插入图片描述
当前的数比后一位数大时,就会和后一位数交换位置

优化

还可以进行一点小优化,当一趟比较下来都没有交换位置,那么就可以结束全部循环,将排序好的结果返回出去

public static int[] sort(int[] arr){

        for (int i = 1; i < arr.length; i++) { // 外层for循环控制的是总的比较趟(轮)数

			// 标志
            boolean flag = true;

            for (int j = 0; j < arr.length-i; j++) { // 内层for循环控制的是每趟两两比较的次数

                // 判断数组中的第j个元素是否比第j+1的元素大,大则进入判断语句中
                if (arr[j] > arr[j+1]){
                    // 创建一个临时变量tmp,存放arr[j]位置的值
                    int tmp = arr[j];
                    // 将arr[j+1]位置的值覆盖到arr[j]的位置
                    arr[j] = arr[j+1];
                    // 将临时变量tmp的值覆盖到arr[j+1]的位置
                    arr[j+1] = tmp;
                    // 因为还有进行交换位置的元素,将flag修改为false,进入下次循环
                    flag = false;
                }
            }
            
            // 当flag为true时表示排序已完成,退出循环
            if (flag){
                break;
            }
        }
        return arr;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值