冒泡排序

概念

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

图解

在这里插入图片描述
如上图所示,假如是升序,排序冒泡排序从数组index=0开始,与相邻数值相互比较,若左边数值大于右边数值,则两数值交换位置,依次类推,直到将最大值放在数组末位。
int[] array = {10,5,6,15,1,3,8};
一轮比较之后15将在数组最末位,因此数组长度为7的外层循环比较次数为6
内层循环每次都从index=0开始两两比较

代码如下

    //冒泡排序
    public static void bubbleSort(int[] arry){
        for (int i=0; i<arry.length-1; i++){
            for (int j=0; j<arry.length-1-i; j++){
                if (arry[j] > arry[j+1]){
                	//此处频繁交换数值,若数组很大则影响性能
                    int tmp = arry[j];
                    arry[j] = arry[j+1];
                    arry[j+1] = tmp;
                }
            }
        }
    }

代码优化如下

    //冒泡排序
    public static void bubbleSort(int[] arry){
        int tmp;
        for (int i=0; i<arry.length-1; i++){
            //保存最大数的索引
            int index = 0;
            for (int j=0; j<arry.length-1-i; j++){
                if (arry[index] < arry[j+1]){
                    index = j + 1;
                }
            }
            //最后一位数值的索引
            int last_index = arry.length-1-i;
            if (index != last_index){
                tmp = arry[index];
                arry[index] = arry[last_index];
                arry[last_index] = tmp;
            }
        }
    }

本来我将优化代码int index = 0; 放在了外层循环外,循环过后index的值不为0导致顺序不对,经debug调试后发现问题,应将int index = 0;放在内层循环处,最后查看输出结果,如下图

        int[] array = {10,5,6,15,1,3,8};
        System.out.println("排序前:" + Arrays.toString(array));
        bubbleSort(array);
        System.out.println("排序后:" + Arrays.toString(array));
排序前:[10, 5, 6, 15, 1, 3, 8]
排序后:[1, 3, 5, 6, 8, 10, 15]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值