搞懂排序算法-冒泡排序

搞懂排序算法-冒泡排序

1冒泡排序

算法思想

  1. 从头开始比较每一对相邻元素,如果第一个比第二个大,就交换他们的位置,执行完一轮后,最末尾的元素就是最大的元素。这个过程就像一个泡泡慢慢向上冒,因此称为冒泡排序。
  2. 忽略第一步中找到的最大元素,重复执行步骤1,直到全部元素有序。

1.1基础冒泡

public static void bubbleSort(int[] array){
    //定义冒泡到哪,也就是末尾已经拍好序的不参与比较
    for (int end = array.length - 1; end > 0; end--){
        //一轮冒泡
        for (int begin = 0; begin < end; begin++){
            //交换
            if (array[begin] > array[begin+1]){
                int temp = array[begin];
                array[begin] = array[begin+1];
                array[begin+1] = temp;
            }
        }
    }
}

1.2冒泡优化1

优化1:如果数组有序,提前结束扫描

也就是,如果数组经过一次扫描就变成有序的,希望程序可以终止,而不是继续扫描。

代码:

public static void bubbleSort(int[] array){
    //定义冒泡到哪,也就是末尾已经拍好序的不参与比较
    for (int end = array.length - 1; end > 0; end--){
        //假定此轮扫描的数组是有序的
        boolean sorted = true;
        //一轮冒泡
        for (int begin = 0; begin < end; begin++){
            //交换
            if (array[begin] > array[begin+1]){
                int temp = array[begin];
                array[begin] = array[begin+1];
                array[begin+1] = temp;
                //进入if程序,说明数组无序
                sorted = false;
            }
        }
        //终止程序
        if (sorted){
            break;
        }
    }
}

1.3冒泡优化2

需求:尾部局部有序,较少比较次数

冒泡优化1是在数组全部完全有序才能进行优化,而全部完全有序的情况是比较少的。因此冒泡优化2对此进行了改进,如果数组尾部已经局部有序,可以记录最后一次交换的位置,减少比较的次数

思路:肯定是改变第一层循环的位置,也就是动end指针

/**
 * 优化2:如果数组尾部局部有序,则后面不参与比较;未优化前,end是end--
 * 优化后让每次让end等于尾部排好序的第一个数字(也就是交互的最后一个数字)
 * @param array
 */
public static void bubbleSort2(Integer[] array){
    //定义冒泡到哪,也就是末尾已经拍好序的不参与比较
    for (int end = array.length - 1; end > 0; end--){
        //sortedIndex=1;如果本身就是有序则直接停止冒泡
        int sortedIndex = 1;
        //一轮冒泡
        for (int begin = 0; begin < end; begin++){
            //交换
            if (array[begin] > array[begin+1]){
                int temp = array[begin];
                array[begin] = array[begin+1];
                array[begin+1] = temp;
                sortedIndex = begin + 1;
            }
        }
        end = sortedIndex;
    }
}

注:仅用于学习交流

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值